Tkinter将回调函数结果传递给另一个类

2024-09-29 23:24:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道如何在tkinter中将返回值从一个类传递到另一个类。 在我的程序中,我有一个DataChosenForm类,我想在Combobox中选择选项,并将这个结果传递给另一个类ReturnData,以便在Label中设置一个变量。在

import tkinter as tk
from tkinter import ttk

class DataChosenForm(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        chosen = tk.LabelFrame(self, text="wybór")
        chosen.grid(row=0)
        self.combo = ttk.Combobox(chosen)
        self.combo['values'] = ('wizz', 'ryanair', 'lot')
        self.combo.grid(row=0, column=2, padx=80, pady=10)
        self.combo.bind("<<ComboboxSelected>>", self.callback)

    def callback(self, event=None):
        if event.widget.get() == 'wizz':
            print('wizz')
            return 'wizz'
        elif event.widget.get() == 'ryanair':
            print('ryanair')
            return 'ryanair'
        elif event.widget.get() == 'lot':
            print('lot')
            return 'lot'

class ReturnData(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)
        var = tk.StringVar()
        message_box = tk.LabelFrame(self, text="wynik")
        message_box.grid(row=1)
        mb = tk.Label(message_box, textvariable=var,anchor='nw')
        mb.pack(padx=120, pady=30)

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

        self.title("program do wyszukiwania cen lotów")
        self.geometry('300x200')
        self.resizable(width=False, height=False)
        DataChosenForm(self).grid(row=0, column=0)
        ReturnData(self).grid(row=1)


if __name__ == "__main__":
    app = Application()
    app.mainloop()

Tags: selfeventinittkinterdeftkgridparent
2条回答

您可以先显示组合框DataChosenForm(self).grid(row=0, column=0),而不调用Application类中的ReturnData。在

然后,在callback()方法中收集选择choice = event.widget.get(),并将其传递给ReturnData。但是,这意味着LabelFrame只有在做出选择之后才会显示。在

import tkinter as tk
from tkinter import ttk

class DataChosenForm(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        chosen = tk.LabelFrame(self, text="wybór")
        chosen.grid(row=0)
        self.combo = ttk.Combobox(chosen)
        self.combo['values'] = ('wizz', 'ryanair', 'lot')
        self.combo.grid(row=0, column=2, padx=80, pady=10)
        self.combo.bind("<<ComboboxSelected>>", self.callback)

    def callback(self, event=None):
        choice = event.widget.get()
        print(choice)
        ReturnData(self, choice).grid(row=1)

class ReturnData(tk.Frame):
    def __init__(self, parent, choice):
        super().__init__(parent)
        message_box = tk.LabelFrame(self, text="wynik")
        message_box.grid(row=1)
        mb = tk.Label(message_box, text=choice, anchor='nw')
        mb.pack(padx=120, pady=30)

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

        self.title("program do wyszukiwania cen lotów")
        self.geometry('300x200')
        self.resizable(width=False, height=False)
        DataChosenForm(self).grid(row=0, column=0)

if __name__ == "__main__":
    app = Application()
    app.mainloop()

我认为@Julia对于您的tkinter应用程序来说基本上是正确的体系结构,但是她的答案可以通过使用tkinterVariable来改进——因为当{}被更改(由其中一个或其他东西更改)时,所有与之关联的小部件都会自动更新其显示值。在

这里有一些关于Variable Classes的文档。请注意,由于ttk.Comboboxwith具有tk.Entry小部件的所有方法,这里有一些关于它们的文档(这也正好说明了将StringVar与一个小部件结合使用的“模式”,因此它也适用于ttk.Combobox)。在

通常,在创建小部件时,可以通过指定一个实例作为option textvariable=关键字参数来告诉小部件使用tkinter Variable。您还可以使用大多数小部件支持的部分字典接口来设置选项,因此像widget['textvariable'] = variable这样的赋值是另一种使用它们的方法—下面的代码使用这两种方法。在

下面是Julia修改后使用tk.StringVar的代码。注意,Combobox不需要一个回调函数来绑定<<ComboboxSelected>>事件,因此所有的复杂性都被消除了。在

import tkinter as tk
from tkinter import ttk

class DataChosenForm(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        choice = tk.LabelFrame(self, text="wybór")
        choice.grid(row=0)
        self.combo = ttk.Combobox(choice)
        self.combo['textvariable'] = parent.var  # Use shared variable.
        self.combo['values'] = ('wizzair', 'ryanair', 'lot')
        self.combo.grid(row=0, column=2, padx=80, pady=10)

class ReturnData(tk.Frame):
    def __init__(self, parent):
        super().__init__(parent)

        message_box = tk.LabelFrame(self, text="wynik")
        message_box.grid(row=1)
        mb = tk.Label(message_box, textvariable=parent.var,  # Use shared variable.
                      anchor='nw', width=20)
        mb.pack(padx=120, pady=30)

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

        self.title("program do wyszukiwania cen lotów")
        self.geometry('300x200')
        self.resizable(width=False, height=False)
        self.var = tk.StringVar(value='Dokonać wyboru')  # Create shared variable.

        DataChosenForm(self).grid(row=0, column=0)
        ReturnData(self).grid(row=1)

if __name__ == "__main__":
    app = Application()
    app.mainloop()

相关问题 更多 >

    热门问题