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

时间:2019-03-13 09:33:13

标签: python tkinter

我想知道如何在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()

3 个答案:

答案 0 :(得分:1)

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

然后,在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()

答案 1 :(得分:0)

我认为@Julia具有适合您的tkinter应用程序的基本体系结构,但是可以通过使用tkinter Variable来改善其答案-因为只要{{{ 1}}被更改(由其中之一或其他方式更改)。

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

通常,通过在创建窗口小部件时指定一个实例作为选项ttk.Combobox关键字参数,可以告诉窗口小部件使用tkinter Variable。您还可以使用大多数窗口小部件支持的部分词典界面来设置选项,因此textvariable=之类的赋值是使用它们的另一种方法-以下代码使用了这两种方法。

此处将Julia的代码修改为使用widget['textvariable'] = variable。请注意,tk.StringVar 不需要不需要回调函数来将Combobox事件绑定到该事件,因此消除了所有复杂性。

<<ComboboxSelected>>

答案 2 :(得分:0)

您可以只将其他类或它的字段传递到__init__的{​​{1}},然后从那里回调函数,然后直接在其中更改类/字段。这就是我的意思,但是我使用TreeView:

DataChosenForm