Python tkinter mainloop 在关闭 window 时没有退出
Python tkinter mainloop not quitting on closing the window
我是编程新手 Python,我正在制作一个计算器应用程序来练习。
我在 Python 2.7 中使用 Tkinter。该应用程序具有您所期望的各种按钮,以及用于显示 numbers/result.
的 Entry 和 Label 小部件
我认为我的程序确实启动了主循环,但关闭 window 并没有停止主循环。由于在我添加 after 循环之前它确实正常工作,所以我认为 after 是问题所在。我也在使用 wait_variable.
如果您能看看我的代码并提出一些建议,我将不胜感激!
我已经包括了主要内容;创建小部件和处理用户 input/results 输出的代码位于不同的文件(按钮、显示、输入)中,但希望没有这些也能理解。
import Tkinter as tk
# These contain the other bits of code
import Buttons as bt
import Displays as ds
import Inputs as ip
class MainWindow(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.parent.title("Calculator")
# Making frames to fill with widgets
self.displays_frame = tk.Frame(parent)
self.displays_frame.grid(padx=10, pady=10)
self.buttons_frame = tk.Frame(parent)
self.buttons_frame.grid()
# Initialising the widgets and user input functions
self.display = ds.Displays(self.displays_frame)
self.button = bt.Button(self.buttons_frame)
self.input = ip.Inputs()
def take_inputs(self, parent):
self.parent = parent
# This waits for a button to be pressed
self.wait_variable(self.button.button_pressed)
# On a button press, its value is inserted into display Entry box/result is put in Label
# Both self.button.button_pressed above and self.display.r below are StringVars
self.input.process_input(self.button.button_pressed, self.display.entry_box, self.display.r)
# Using after here so it keeps waiting for button presses to be recorded
self.after(100, self.take_inputs, self.parent)
def main():
root = tk.Tk()
app = MainWindow(root)
# Here the wait_variable and after functions are called
app.take_inputs(root)
# The below string is printed after the first button has been pressed
print "main, now starting mainloop"
root.mainloop()
# "finished" is never printed
print "finished"
if __name__ == '__main__':
main()
我想我已经创建了自己的事件处理程序而不是使用 mainloop,我确实尝试将 self.parent.protocol("WM_DELETE_WINDOW", self.end(parent))
添加到 take_inputs 方法,这样我就可以退出所有内容而无需运行 mainloop。 self.end 函数有一个方法我添加到 MainWindow class 打印 "closing now" 然后退出或销毁程序。
但是,我为 protocol
放入的任何函数都会立即运行; "WM_DELETE_WINDOW"
没有被正确查找(用 "foo" 替换 "WM_DELETE_WINDOW" 没有给出错误)。
感谢您的帮助!
我在没有使用 wait_variable 的情况下重写了代码。我想问题是关闭 window 没有通过 wait_variable 所以代码永远不会回到主循环。
这是新的 take_inputs 方法。 button.button_go
是一个布尔变量,最初定义为 False,但作为绑定到鼠标单击的按钮的一部分设置为 True(未显示)。
def take_inputs(self, parent):
self.parent = parent
# button.button_go is immediately set to False on updating the display box
if self.button.button_go == True:
self.input.process_input(self.button, self.display.entry_box, self.display.r)
self.button.button_go = False
self.after(100, self.take_inputs, self.parent)
after() 方法现在可以像预期的那样与 mainloop 一起很好地工作。对 wait_variable 感到羞耻。听起来不错,但显然不是很有用。
我不知道为什么 wm_protocol "WM_DELETE_WINDOW" 定义不起作用!
我是编程新手 Python,我正在制作一个计算器应用程序来练习。 我在 Python 2.7 中使用 Tkinter。该应用程序具有您所期望的各种按钮,以及用于显示 numbers/result.
的 Entry 和 Label 小部件我认为我的程序确实启动了主循环,但关闭 window 并没有停止主循环。由于在我添加 after 循环之前它确实正常工作,所以我认为 after 是问题所在。我也在使用 wait_variable.
如果您能看看我的代码并提出一些建议,我将不胜感激! 我已经包括了主要内容;创建小部件和处理用户 input/results 输出的代码位于不同的文件(按钮、显示、输入)中,但希望没有这些也能理解。
import Tkinter as tk
# These contain the other bits of code
import Buttons as bt
import Displays as ds
import Inputs as ip
class MainWindow(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.parent.title("Calculator")
# Making frames to fill with widgets
self.displays_frame = tk.Frame(parent)
self.displays_frame.grid(padx=10, pady=10)
self.buttons_frame = tk.Frame(parent)
self.buttons_frame.grid()
# Initialising the widgets and user input functions
self.display = ds.Displays(self.displays_frame)
self.button = bt.Button(self.buttons_frame)
self.input = ip.Inputs()
def take_inputs(self, parent):
self.parent = parent
# This waits for a button to be pressed
self.wait_variable(self.button.button_pressed)
# On a button press, its value is inserted into display Entry box/result is put in Label
# Both self.button.button_pressed above and self.display.r below are StringVars
self.input.process_input(self.button.button_pressed, self.display.entry_box, self.display.r)
# Using after here so it keeps waiting for button presses to be recorded
self.after(100, self.take_inputs, self.parent)
def main():
root = tk.Tk()
app = MainWindow(root)
# Here the wait_variable and after functions are called
app.take_inputs(root)
# The below string is printed after the first button has been pressed
print "main, now starting mainloop"
root.mainloop()
# "finished" is never printed
print "finished"
if __name__ == '__main__':
main()
我想我已经创建了自己的事件处理程序而不是使用 mainloop,我确实尝试将 self.parent.protocol("WM_DELETE_WINDOW", self.end(parent))
添加到 take_inputs 方法,这样我就可以退出所有内容而无需运行 mainloop。 self.end 函数有一个方法我添加到 MainWindow class 打印 "closing now" 然后退出或销毁程序。
但是,我为 protocol
放入的任何函数都会立即运行; "WM_DELETE_WINDOW"
没有被正确查找(用 "foo" 替换 "WM_DELETE_WINDOW" 没有给出错误)。
感谢您的帮助!
我在没有使用 wait_variable 的情况下重写了代码。我想问题是关闭 window 没有通过 wait_variable 所以代码永远不会回到主循环。
这是新的 take_inputs 方法。 button.button_go
是一个布尔变量,最初定义为 False,但作为绑定到鼠标单击的按钮的一部分设置为 True(未显示)。
def take_inputs(self, parent):
self.parent = parent
# button.button_go is immediately set to False on updating the display box
if self.button.button_go == True:
self.input.process_input(self.button, self.display.entry_box, self.display.r)
self.button.button_go = False
self.after(100, self.take_inputs, self.parent)
after() 方法现在可以像预期的那样与 mainloop 一起很好地工作。对 wait_variable 感到羞耻。听起来不错,但显然不是很有用。
我不知道为什么 wm_protocol "WM_DELETE_WINDOW" 定义不起作用!