>  기사  >  백엔드 개발  >  Python Tkinter GUI 프로그래밍에서 프레임 전환을 구현하는 방법

Python Tkinter GUI 프로그래밍에서 프레임 전환을 구현하는 방법

PHPz
PHPz앞으로
2023-05-11 16:25:121870검색

1. Frame의 tkraise() 메소드 소개

일반적으로 Tkinter 애플리케이션은 여러 프레임으로 구성됩니다. 그리고 사용자 선택과 관련된 프레임을 표시하기 위해 프레임 간에 전환해야 하는 경우도 많습니다.

Tkinter에서는 프레임을 서로 쌓을 수 있습니다. 특정 프레임을 표시하려면 쌓인 순서대로 프레임을 다른 프레임 위에 놓으면 됩니다. 상단 프레임이 표시됩니다.

Frame을 맨 위에 놓으려면 아래와 같이 Frame 위젯의 tkraise() 메서드를 사용할 수 있습니다.

frame.tkraise()

2. tkraise 사용 예

다음은 화씨와 섭씨를 사용하여 작은 온도 변환 애플리케이션을 구현합니다. 두 개의 서로 다른 프레임, UI 창은 다음과 같이 구성됩니다.

Python Tkinter GUI 프로그래밍에서 프레임 전환을 구현하는 방법

ConverterFrame에는 두 개의 인스턴스가 있습니다. 하나는 온도를 화씨에서 섭씨로 변환하고 다른 하나는 온도를 섭씨에서 화씨로 변환합니다.

Python Tkinter GUI 프로그래밍에서 프레임 전환을 구현하는 방법

첫 번째 단계는 fahrenheit_to_celsius 및 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

fahrenheit_to_celsius 및 celsius_to_fahrenheit 메소드는 두 번째 인수가 생략되거나 True가 전달되면 형식화된 문자열을 반환합니다. 그렇지 않으면 결과를 숫자로 반환합니다.

두 번째 단계에서는 온도를 화씨에서 섭씨로 또는 그 반대로 변환하기 위한 UI를 표시하는 ConverterFrame을 정의합니다.

이를 위해 __init__() 메소드에 다음 매개변수를 추가하여 ConverterFrame을 더욱 유연하게 만드세요:

  • 화씨와 섭씨로 표시될 문자열

  • 온도 변환을 위한 콜백 함수.

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 = ''

위 코드는 어떻게 작동하나요?

  • 1) 온도 라벨을 표시하려면 unit_from 매개변수를 사용하세요.

  • 2) 온도를 한 단위에서 다른 단위로 변환하려면 변환() 메서드에서 self.convert 콜백을 호출하세요.

  • 3) Frame이 서로 전환될 때 항목 위젯과 결과 레이블을 지우는 Reset() 메서드를 정의합니다.

셋째, 표시할 프레임을 선택하기 위한 라디오 버튼을 표시하는 ControlFrame 클래스를 정의합니다. ControFrame 클래스는 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()

위 코드는 어떻게 작동하나요?

  • 각 라디오 버튼의 값은 0 또는 1입니다.

  • ConverterFrame 클래스의 두 인스턴스를 만듭니다. 하나는 화씨에서 섭씨로 온도를 변환하고 다른 하나는 온도를 섭씨에서 화씨로 변환합니다. 또한 이러한 프레임을 저장할 사전을 정의하세요. 프레임의 키는 라디오 버튼의 값과 동일합니다.

  • 라디오 버튼을 클릭하면 선택된 버튼의 값에 따라 사전에서 해당 프레임을 선택하기 위해 Change_frame() 메서드가 호출됩니다.

  • 입력 필드와 결과 레이블을 재설정하는 호출 프레임의 재설정() 메서드입니다. 또한 tkraise() 메서드를 호출하여 프레임을 표시합니다.

넷째, tk.Tk 클래스에서 상속받은 App 클래스를 정의합니다.

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

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

마지막으로 프로그램을 시작합니다.

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

코드는 다음과 같이 통합됩니다.

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

실행 결과는 다음과 같습니다.

Python Tkinter GUI 프로그래밍에서 프레임 전환을 구현하는 방법

위 내용은 Python Tkinter GUI 프로그래밍에서 프레임 전환을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제