Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter

Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter

PHPz
PHPzke hadapan
2023-05-11 16:25:121870semak imbas

1. Pengenalan kepada kaedah tkraise() Frame

Biasanya, aplikasi Tkinter terdiri daripada berbilang Bingkai. Dan anda sering perlu bertukar antara Bingkai untuk memaparkan Bingkai yang berkaitan dengan pilihan pengguna.

Tkinter membenarkan menyusun Bingkai di atas satu sama lain. Untuk memaparkan Bingkai tertentu, hanya letakkan satu di atas satu lagi dalam susunan susunan. Bingkai atas akan kelihatan.

Untuk meletakkan Bingkai di atas, anda boleh menggunakan kaedah tkraise() widget Bingkai, seperti yang ditunjukkan di bawah:

frame.tkraise()

2 contoh penggunaan tkraise

Yang berikut akan melaksanakan satu aplikasi kecil penukaran Suhu menggunakan dua Bingkai berbeza untuk suhu Fahrenheit dan Celsius Tetingkap UI terdiri seperti berikut:

Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter

ConverterFrame akan mempunyai dua kejadian, satu untuk menukarkan. suhu daripada Fahrenheit kepada Fahrenheit Tukar suhu kepada Celsius dan satu lagi untuk menukar suhu daripada Celsius kepada Fahrenheit:

Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter

Dalam langkah pertama, tentukan kelas TemperatureConverter dengan dua kaedah statik: fahrenheit_to_celsius dan celsius_to_fahrenheit.

class TemperatureConverter:
    @staticmethod
    def fahrenheit_to_celsius(f, format=True):
        result = (f - 32) * 5/9
        if format:
            return f'{f} Fahrenheit = {result:.2f} Celsius'
        return result

    @staticmethod
    def celsius_to_fahrenheit(c, format=True):
        result = c * 9/5 + 32
        if format:
            return f'{c} Celsius = {result:.2f} Fahrenheit'
        return result

Kaedah fahrenheit_to_celsius dan celsius_to_fahrenheit akan mengembalikan rentetan berformat jika argumen kedua ditinggalkan atau Benar diserahkan kepada mereka. Jika tidak, mereka mengembalikan hasilnya sebagai nombor.

Langkah kedua, tentukan ConverterFrame yang akan memaparkan UI untuk menukar suhu daripada Fahrenheit kepada Celsius dan sebaliknya.

Untuk melakukan ini, jadikan ConverterFrame lebih fleksibel dengan menambahkan parameter berikut pada kaedah __init__() :

  • String yang akan dipaparkan sebagai Fahrenheit dan Celsius

  • Fungsi panggil balik digunakan untuk menukar suhu.

class ConverterFrame(ttk.Frame):
    def __init__(self, container, unit_from, converter):
        super().__init__(container)

        self.unit_from = unit_from
        self.converter = converter

        # field options
        options = {'padx': 5, 'pady': 0}

        # temperature label
        self.temperature_label = ttk.Label(self, text=self.unit_from)
        self.temperature_label.grid(column=0, row=0, sticky='w',  **options)

        # temperature entry
        self.temperature = tk.StringVar()
        self.temperature_entry = ttk.Entry(self, textvariable=self.temperature)
        self.temperature_entry.grid(column=1, row=0, sticky='w', **options)
        self.temperature_entry.focus()

        # button
        self.convert_button = ttk.Button(self, text='Convert')
        self.convert_button.grid(column=2, row=0, sticky='w', **options)
        self.convert_button.configure(command=self.convert)

        # result label
        self.result_label = ttk.Label(self)
        self.result_label.grid(row=1, columnspan=3, **options)

        # add padding to the frame and show it
        self.grid(column=0, row=0, padx=5, pady=5, sticky="nsew")

    def convert(self, event=None):
        """  Handle button click event
        """
        try:
            input_value = float(self.temperature.get())
            result = self.converter(input_value)
            self.result_label.config(text=result)
        except ValueError as error:
            showerror(title='Error', message=error)

    def reset(self):
        self.temperature_entry.delete(0, "end")
        self.result_label.text = ''

Bagaimana kod di atas berfungsi?

  • 1) Gunakan parameter unit_from untuk memaparkan label suhu.

  • 2) Panggil panggilan balik self.convert dalam kaedah convert() untuk menukar suhu daripada satu unit kepada unit yang lain.

  • 3) Tentukan kaedah tetapan semula() untuk mengosongkan widget masukan dan label hasil apabila Bingkai bertukar dari satu kepada yang lain.

Ketiga, tentukan kelas ControlFrame yang memaparkan butang radio untuk memilih Bingkai yang hendak dipaparkan. Kelas ControFrame mewarisi daripada ttk.LabelFrame.

class ControlFrame(ttk.LabelFrame):
    def __init__(self, container):

        super().__init__(container)
        self['text'] = 'Options'

        # radio buttons
        self.selected_value = tk.IntVar()

        ttk.Radiobutton(
            self,
            text='F to C',
            value=0,
            variable=self.selected_value,
            command=self.change_frame).grid(column=0, row=0, padx=5, pady=5)

        ttk.Radiobutton(
            self,
            text='C to F',
            value=1,
            variable=self.selected_value,
            command=self.change_frame).grid(column=1, row=0, padx=5, pady=5)

        self.grid(column=0, row=1, padx=5, pady=5, sticky='ew')

        # initialize frames
        self.frames = {}
        self.frames[0] = ConverterFrame(
            container,
            'Fahrenheit',
            TemperatureConverter.fahrenheit_to_celsius)
        self.frames[1] = ConverterFrame(
            container,
            'Celsius',
            TemperatureConverter.celsius_to_fahrenheit)

        self.change_frame()

    def change_frame(self):
        frame = self.frames[self.selected_value.get()]
        frame.reset()
        frame.tkraise()

Bagaimana kod di atas berfungsi?

  • Setiap butang radio mempunyai nilai 0 atau 1.

  • Buat dua tika kelas ConverterFrame, satu bertanggungjawab untuk menukar suhu daripada Fahrenheit kepada Celsius dan satu lagi bertanggungjawab untuk menukar suhu daripada Celsius kepada Fahrenheit. Selain itu, tentukan kamus untuk menyimpan Bingkai ini. Kekunci Bingkai adalah sama dengan nilai butang radio.

  • Apabila butang radio diklik, kaedah change_frame() dipanggil untuk memilih Bingkai yang sepadan daripada kamus berdasarkan nilai butang yang dipilih.

  • Kaedah tetapan semula() Panggil Frame untuk menetapkan semula medan input dan label hasil. Dan juga memanggil kaedah tkraise() untuk memaparkan Bingkai.

Keempat, tentukan kelas Apl yang diwarisi daripada kelas tk.Tk:

class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Temperature Converter')
        self.geometry('300x120')
        self.resizable(False, False)

Akhir sekali, mulakan program

if __name__ == "__main__":
    app = App()
    ControlFrame(app)
    app.mainloop()

Kod disepadukan sebagai berikut:

import tkinter as tk
from tkinter import ttk
from tkinter.messagebox import showerror


class TemperatureConverter:
    @staticmethod
    def fahrenheit_to_celsius(f, format=True):
        result = (f - 32) * 5/9
        if format:
            return f'{f} Fahrenheit = {result:.2f} Celsius'
        return result

    @staticmethod
    def celsius_to_fahrenheit(c, format=True):
        result = c * 9/5 + 32
        if format:
            return f'{c} Celsius = {result:.2f} Fahrenheit'
        return result


class ConverterFrame(ttk.Frame):
    def __init__(self, container, unit_from, converter):
        super().__init__(container)

        self.unit_from = unit_from
        self.converter = converter

        # field options
        options = {'padx': 5, 'pady': 0}

        # temperature label
        self.temperature_label = ttk.Label(self, text=self.unit_from)
        self.temperature_label.grid(column=0, row=0, sticky='w',  **options)

        # temperature entry
        self.temperature = tk.StringVar()
        self.temperature_entry = ttk.Entry(self, textvariable=self.temperature)
        self.temperature_entry.grid(column=1, row=0, sticky='w', **options)
        self.temperature_entry.focus()

        # button
        self.convert_button = ttk.Button(self, text='Convert')
        self.convert_button.grid(column=2, row=0, sticky='w', **options)
        self.convert_button.configure(command=self.convert)

        # result label
        self.result_label = ttk.Label(self)
        self.result_label.grid(row=1, columnspan=3, **options)

        # add padding to the frame and show it
        self.grid(column=0, row=0, padx=5, pady=5, sticky="nsew")

    def convert(self, event=None):
        """  Handle button click event
        """
        try:
            input_value = float(self.temperature.get())
            result = self.converter(input_value)
            self.result_label.config(text=result)
        except ValueError as error:
            showerror(title='Error', message=error)

    def reset(self):
        self.temperature_entry.delete(0, "end")
        self.result_label.text = ''


class ControlFrame(ttk.LabelFrame):
    def __init__(self, container):

        super().__init__(container)
        self['text'] = 'Options'

        # radio buttons
        self.selected_value = tk.IntVar()

        ttk.Radiobutton(
            self,
            text='F to C',
            value=0,
            variable=self.selected_value,
            command=self.change_frame).grid(column=0, row=0, padx=5, pady=5)

        ttk.Radiobutton(
            self,
            text='C to F',
            value=1,
            variable=self.selected_value,
            command=self.change_frame).grid(column=1, row=0, padx=5, pady=5)

        self.grid(column=0, row=1, padx=5, pady=5, sticky='ew')

        # initialize frames
        self.frames = {}
        self.frames[0] = ConverterFrame(
            container,
            'Fahrenheit',
            TemperatureConverter.fahrenheit_to_celsius)
        self.frames[1] = ConverterFrame(
            container,
            'Celsius',
            TemperatureConverter.celsius_to_fahrenheit)

        self.change_frame()

    def change_frame(self):
        frame = self.frames[self.selected_value.get()]
        frame.reset()
        frame.tkraise()


class App(tk.Tk):
    def __init__(self):
        super().__init__()

        self.title('Temperature Converter')
        self.geometry('480x240')
        self.resizable(False, False)


if __name__ == "__main__":
    app = App()
    ControlFrame(app)
    app.mainloop()

Keputusan larian adalah seperti berikut:

Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam