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()
Yang berikut akan melaksanakan satu aplikasi kecil penukaran Suhu menggunakan dua Bingkai berbeza untuk suhu Fahrenheit dan Celsius Tetingkap UI terdiri seperti berikut:
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:
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:
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!