Я пытаюсь написать 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()
Я надеюсь, что это достаточно ясно.