Передача значений из дочернего окна в родительский в tkinter (python3): неожиданное поведение

Я пытаюсь написать Python GUI с tkinter, который, помимо прочего, будет работать со значениями, введенными во всплывающее «дочернее» окно. Вот очень урезанная версия 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) 

Очевидно, я не понимаю процесс в методе обновления, так как print(self.amount) не дает ожидаемое значение '2'. Скорее, он дает некоторое число с плавающей запятой, которое появляется перед тем, как я нажимаю кнопку «отправить», и становится разным при каждом запуске кода. Есть ли способ сообщить главному окну, чтобы он дождался, пока Child вернет значение? Кроме того, кто-нибудь может объяснить, что это за десятичное число? Я ожидал бы, что оператор print хотя бы вернет 0?

Я смотрел на эту тему и до сих пор не мог понять, как решить проблему.

Любая помощь, критика или ссылки на ссылки будут оценены!

Всего 1 ответ


Добро пожаловать в Stackoverflow. Спасибо за ясный лаконичный вопрос.

Когда вы назначаете Child для self.amount в своем методе обновления, вы немедленно распечатываете его. На моей консоли я получаю. Ребенок напечатан. Метод завершает, он не ждет никаких действий в Child. Он создает окно, печатает значение количества и затем ожидает взаимодействия пользователя с любым из окон. В методе обновления вы установили сумму, чтобы быть объектом, созданным 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(Ɔ') # 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()

Я надеюсь, что это достаточно ясно.


Есть идеи?

10000