我正在尝试使用tkinter编写python GUI,除其他外,它将与在弹出的“子”窗口中输入的值一起使用。这是GUI的简化版本:
from minimalChild import Child
import tkinter as tk
class exGui(tk.Tk):
def update(self):
self.amount = Child(self)
print(self.amount)
def __init__(self):
tk.Tk.__init__(self)
frame = tk.Frame(self)
frame.grid()
self.amount = 0
self.button = tk.Button(frame, text="pay", command=self.update).grid(row=0, column=0)
self.button = tk.Button(frame, text="Quit", fg="red", command=frame.quit).grid(row=0, column=1)
def main():
exGui().mainloop()
if __name__ == '__main__':
main()
和Child类的最低版本:
import tkinter as tk
class Child(tk.Toplevel):
def submitFunction(self):
amount = 2
self.parent.amount= amount
self.destroy()
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.parent = parent
self.frame = tk.Frame(self)
self.frame.grid()
submit = tk.Button(self.frame, text='Submit', command = self.submitFunction).grid(row=0, column=0)
很显然,我不了解update方法中的流程,因为print(self.amount)
没有给出期望值'2'。相反,它提供了一些浮点数,这些浮点数在我单击“提交”按钮之前出现,并且每次运行代码时都不同。有什么方法可以告诉主窗口等待Child返回值吗?另外,谁能解释那个十进制数字是什么?我本来希望print语句至少返回0?
我已经看过这个线程Pass user input from child to parent window python tkinter,但仍然不明白如何解决该问题。
任何帮助,批评或指向参考的指点,将不胜感激!
答案 0 :(得分:0)
欢迎使用Stackoverflow。感谢您提出的简洁明了的问题。
在更新方法中将Child分配给self.amount时,将立即将其打印出来。在我的控制台上,我得到。!Child打印。该方法完成后,无需等待Child中的任何操作。它创建一个窗口,打印出value的值,然后等待用户与两个窗口中的任何一个交互。在update方法中,您将amount设置为Child()创建的对象。
您写的内容可能会将parent.amount设置为2,但是在您打印结果后才这样做。
我已经在您的主窗口中添加了一个结果标签,该标签最初显示为0。“从子代提交”将其设置为2。
import tkinter as tk
class Child(tk.Toplevel):
def submitFunction(self):
amount = 2
self.parent.amount.set(str( amount)) # Set parent amount.
self.destroy()
def __init__(self, parent):
tk.Toplevel.__init__(self, parent)
self.parent = parent
self.frame = tk.Frame(self)
self.frame.grid()
submit = tk.Button(self.frame, text='Submit', command = self.submitFunction).grid(row=0, column=0)
class exGui(tk.Tk):
def update(self):
self.kid = Child(self)
print(self.amount, self.kid, self.amount.get())
def __init__(self):
tk.Tk.__init__(self)
frame = tk.Frame(self)
frame.grid()
self.amount = tk.StringVar() # Make amount a StringVar
self.amount.set('0') # Set it to 0
self.button = tk.Button(frame, text="pay", command=self.update).grid(row=0, column=0)
self.button = tk.Button(frame, text="Quit", fg="red", command=frame.quit).grid(row=0, column=1)
self.result = tk.Label(frame, textvariable = self.amount).grid(row=0, column=2) # Add a result label.
# This is linked to the self.amount StringVar.
def main():
exGui().mainloop()
我希望这很清楚。