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