Bagaimana untuk melaksanakan penukaran Bingkai dalam pengaturcaraan GUI Python Tkinter

PHPz
Lepaskan: 2023-05-11 16:25:12
ke hadapan
1853 orang telah melayarinya

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()
Salin selepas log masuk

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
Salin selepas log masuk

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 = ''
Salin selepas log masuk

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()
Salin selepas log masuk

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)
Salin selepas log masuk

Akhir sekali, mulakan program

if __name__ == "__main__":
    app = App()
    ControlFrame(app)
    app.mainloop()
Salin selepas log masuk

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()
Salin selepas log masuk

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!

Label berkaitan:
sumber:yisu.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!