Передача значений из дочернего окна в родительский в tkinter (python3): неожиданное поведение - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь написать Python GUI с tkinter, который, помимо прочего, будет работать со значениями, введенными во всплывающее «дочернее» окно.Вот очень урезанная версия графического интерфейса:

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

и минимальная версия дочернего класса:

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?

Я смотрел на эту ветку Передача пользовательского ввода от дочернего к родительскому окну python tkinter и все еще не мог понять, как решитьпроблема.

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

1 Ответ

0 голосов
/ 17 мая 2019

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

Когда вы назначаете Child для self.amount в своем методе обновления, вы немедленно распечатываете его.На моей консоли я получаю. Ребенок напечатан.Метод завершает, он не ждет никаких действий в Child.Он создает окно, печатает значение количества и затем ожидает взаимодействия пользователя с любым из окон.В методе обновления вы установили сумму для объекта, созданного Child ().

Вероятно, то, что вы написали, устанавливает parent.amount в 2, но это происходит после того, как вы напечатали результат.

Я добавил метку результата в ваше главное окно, которая изначально показывает 0. При отправке от Child устанавливается значение 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()

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...