如何正确实现wait_window()?

时间:2018-01-17 02:10:46

标签: python user-interface tkinter

import tkinter as tk

class MainWindow:

    def __init__(self, master):
        self.master = master

        self.button_height = 2
        self.button_width = 8

        self.list_of_tasks = []

        **#Other irrelevant code**

        #Button for adding a new task to current tab
        self.new_task = tk.Button(self.buttons_frame, bg="yellow", height=self.button_height, width=self.button_width*2,
                                  text="New Task",  command=self.create_new_task)
        self.new_task.grid(row=1, column=0, columnspan=2, sticky="N"+"W"+"S"+"E")

        #Frame for holding all tasks in currently selected tab
        self.tasks_in_tab = tk.Frame(master, height=300, width=300)
        self.tasks_in_tab.grid(row=2, rowspan=5, column=0, columnspan=5)

    def create_new_task(self):
        #Creates a new task
        new_window = tk.Toplevel(self.master)
        entry_window = Task_Entry(new_window)

        entry_window.wait_window(entry_window)

        task = tk.Button(self.tasks_in_tab, text=entry_window.test_entry)
        self.list_of_tasks.append(task)
        task.pack()

class Task_Entry:
    #Window for entering data into a new window
    def __init__(self, master):
        self.master = master

        self.test_entry_field = tk.Entry(self.master)
        self.test_entry_field.pack()
        self.test_entry = self.test_entry_field.get()

        self.cancel_button = tk.Button(self.master, text="Cancel", command=self.exit_program)
        self.cancel_button.pack()

    def exit_program(self):
        self.master.destroy()


root = tk.Tk()
gui = MainWindow(root)
root.mainloop()

我试图在我的代码中使用Tkinter的wait_window函数,但我不确定如何在我希望实现它的上下文中正确使用它。

假设发生的是用户点击new_task按钮,调用函数create_new_task。然后,它会提示存储在类Task_Entry下的新窗口,该窗口包含用于输入文本的Entry字段。一旦用户输入他们的输入Task_Entry窗口终止,用户输入 - 在被调用的test_entry窗口类的Task_Entry字段下 - 应该被传递给新的按钮名为task

我很确定我应该使用wait_window()冻结create_new_task函数,直到用户提交了他们的输入,但我无法正确实现其实现。

此外,我认为我错误地从Task_Entry下的entry_windowget() set()content: EMPLOYEE: ADDITIONALLANGUAGES: ADDITIONALLANGUAGE: LANGUAGE: "Spanish" 检索了用户的输入。任何澄清也会在那里提供巨大的帮助。

1 个答案:

答案 0 :(得分:1)

替换:

entry_window.wait_window(entry_window)

使用:

entry_window.test_entry_field.wait_window(entry_window.test_entry_field)

因为wait_window widget 类对象的方法,而entry_windowTask_Entry的对象,它甚至不从窗口小部件类继承。这意味着没有定义wait_window方法。但是,它有一个属性test_entry_field,它是一个小部件,因此有一个定义的wait_window方法。

原样,你在代码中过早地使用get,它会立即返回条目内的内容,在销毁条目之前应该将其移动到右边,例如在{{1}的回调中}按钮:

"Cancel"

使用def exit_program(self): self.test_entry = self.test_entry_field.get() self.master.destroy() 按钮时,代码应该按照您希望的方式工作:

"Cancel"

另请注意,您无法使用import tkinter as tk class MainWindow: def __init__(self, master): self.master = master self.button_height = 2 self.button_width = 8 self.list_of_tasks = [] #Other irrelevant code** #Button for adding a new task to current tab self.new_task = tk.Button(self.master, bg="yellow", height=self.button_height, width=self.button_width*2, text="New Task", command=self.create_new_task) self.new_task.grid(row=1, column=0, columnspan=2, sticky="N"+"W"+"S"+"E") #Frame for holding all tasks in currently selected tab self.tasks_in_tab = tk.Frame(master, height=300, width=300) self.tasks_in_tab.grid(row=2, rowspan=5, column=0, columnspan=5) def create_new_task(self): #Creates a new task new_window = tk.Toplevel(self.master) entry_window = Task_Entry(new_window) entry_window.test_entry_field.wait_window(entry_window.test_entry_field) task = tk.Button(self.tasks_in_tab, text=entry_window.test_entry) self.list_of_tasks.append(task) task.pack() class Task_Entry: #Window for entering data into a new window def __init__(self, master): self.master = master self.test_entry_field = tk.Entry(self.master) self.test_entry_field.pack() self.cancel_button = tk.Button(self.master, text="Cancel", command=self.exit_program) self.cancel_button.pack() def exit_program(self): self.test_entry = self.test_entry_field.get() self.master.destroy() root = tk.Tk() gui = MainWindow(root) root.mainloop() 作为输入字段,但是,您可以使用set,或者您可以为条目指定variable class,然后能够使用insert