在Tkinter(python3)中将值从子窗口传递给父窗口:意外行为

时间:2019-05-17 18:14:39

标签: python python-3.x tkinter

我正在尝试使用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,但仍然不明白如何解决该问题。

任何帮助,批评或指向参考的指点,将不胜感激!

1 个答案:

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

我希望这很清楚。