Heim  >  Artikel  >  Backend-Entwicklung  >  So implementieren Sie Frame-Switching in der Python-Tkinter-GUI-Programmierung

So implementieren Sie Frame-Switching in der Python-Tkinter-GUI-Programmierung

PHPz
PHPznach vorne
2023-05-11 16:25:121760Durchsuche

1. Einführung in die tkraise()-Methode von Frame

Normalerweise besteht eine Tkinter-Anwendung aus mehreren Frames. Und Sie müssen oft zwischen Frames wechseln, um den Frame anzuzeigen, der für die Auswahl des Benutzers relevant ist.

Tkinter ermöglicht das Stapeln von Frames übereinander. Um einen bestimmten Rahmen anzuzeigen, platzieren Sie ihn einfach in Stapelreihenfolge übereinander. Der obere Rahmen wird sichtbar sein.

Um den Frame oben zu platzieren, können Sie die tkraise()-Methode des Frame-Widgets verwenden, wie unten gezeigt:

frame.tkraise()

2, tkraise-Verwendungsbeispiel

#🎜 🎜#Im Folgenden wird eine kleine Anwendung zur Temperaturumrechnung in Fahrenheit und Celsius implementiert, die jeweils zwei verschiedene Frames verwendet:

So implementieren Sie Frame-Switching in der Python-Tkinter-GUI-Programmierung# 🎜🎜#ConverterFrame Es wird zwei Instanzen geben, eine zum Konvertieren der Temperatur von Fahrenheit in Celsius und die andere zum Konvertieren der Temperatur von Celsius in Fahrenheit:

#🎜🎜 # Definieren Sie in einem Schritt eine TemperatureConverter-Klasse mit zwei statischen Methoden: fahrenheit_to_celsius und celsius_to_fahrenheit. So implementieren Sie Frame-Switching in der Python-Tkinter-GUI-Programmierung

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

Die Methoden fahrenheit_to_celsius und celsius_to_fahrenheit geben eine formatierte Zeichenfolge zurück, wenn das zweite Argument weggelassen oder True an sie übergeben wird. Andernfalls geben sie das Ergebnis als Zahl zurück.

Zweiten Schritt: Definieren Sie den ConverterFrame, der die Benutzeroberfläche zum Umrechnen der Temperatur von Fahrenheit in Celsius und umgekehrt anzeigt.

Dazu müssen Sie den ConverterFrame flexibler machen, indem Sie der

-Methode die folgenden Parameter hinzufügen:

__init__()

will Zeigt die Temperatur in Fahrenheit und Celsius an. Zeichenfolge
  • Rückruffunktion zur Umrechnung der Temperatur.
  • 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 = ''

    Wie funktioniert der obige Code?

1) Verwenden Sie den Parameter „unit_from“, um die Temperaturbezeichnung anzuzeigen.
  • 2) Rufen Sie den self.convert-Rückruf in der Methode „convert()“ auf, um die Temperatur von einer Einheit in eine andere umzurechnen.
  • 3) Definieren Sie die Methode reset(), um die Eintrags-Widgets und Ergebnisbeschriftungen zu löschen, wenn der Frame von einem zum anderen wechselt.
  • Drittens definieren Sie eine ControlFrame-Klasse, die Optionsfelder zur Auswahl des anzuzeigenden Frames anzeigt. Die ControFrame-Klasse erbt von 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()
Wie funktioniert der obige Code?

Jedes Optionsfeld hat einen Wert von 0 oder 1.
  • Erstellen Sie zwei Instanzen der ConverterFrame-Klasse, eine für die Konvertierung der Temperatur von Fahrenheit in Celsius und die andere für die Konvertierung der Temperatur von Celsius in Fahrenheit. Definieren Sie außerdem ein Wörterbuch zum Speichern dieser Frames. Die Tasten des Frames stimmen mit den Werten der Optionsfelder überein.
  • Wenn auf ein Optionsfeld geklickt wird, wird die Methode change_frame() aufgerufen, um den entsprechenden Frame aus dem Wörterbuch basierend auf dem Wert der ausgewählten Schaltfläche auszuwählen.
  • Rufen Sie die Methode reset() von Frame auf, um die Eingabefelder und Ergebnisbeschriftungen zurückzusetzen. Und ruft außerdem die Methode tkraise() auf, um den Frame anzuzeigen.
  • Viertens definieren Sie die von der tk.Tk-Klasse geerbte App-Klasse:
  • class App(tk.Tk):
        def __init__(self):
            super().__init__()
    
            self.title('Temperature Converter')
            self.geometry('300x120')
            self.resizable(False, False)
Starten Sie abschließend das Programm

if __name__ == "__main__":
    app = App()
    ControlFrame(app)
    app.mainloop()
# 🎜 🎜#Der Code ist wie folgt eingebunden:

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()

Die laufenden Ergebnisse sind wie folgt:

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Frame-Switching in der Python-Tkinter-GUI-Programmierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen