tkinter的mainloop收集了什么样的代码?

时间:2018-02-17 12:22:25

标签: python tkinter

假设我有像这样的Python代码

# <Pure Python statement A>
root = tk.Tk()
mainframe = tk.Frame(root)
# <Pure Python statement B>
# <other tkinter code>
root.mainloop()

哪些陈述最终会出现在tkinter的主循环上?它只是3个tkinter声明吗?

编辑

必须有更多的事情发生,因为tkinter代码之间的某些代码会受到影响:当我运行以下代码时(取自另一个问题)

import tkinter as tk
import tkinter.filedialog

filename = ""

def op():
    global filename
    filename =tk.filedialog.askopenfilename()

root = tk.Tk()
mainframe = tk.Frame(root)
mainframe.grid(column=0, row=0)
tk.Button(mainframe, text="Open file", command=op).grid(column=0, row=1)
root.mainloop()
print(filename)
关闭程序后,

显示所选文件名。但是在运行时

import tkinter as tk
import tkinter.filedialog

filename = "this_is_a_test"

def op():
    global filename
    filename =tk.filedialog.askopenfilename()

root = tk.Tk()
mainframe = tk.Frame(root)
mainframe.grid(column=0, row=0)
tk.Button(mainframe, text="Open file", command=op).grid(column=0, row=1)
print(filename)
root.mainloop()

关闭程序后,不显示任何内容。所以,mainloop之前的纯Python语句似乎被吸收了。

2 个答案:

答案 0 :(得分:2)

  

tkinter的mainloop收集什么样的代码?

它不会收集任何东西。它只处理事件,并调用绑定到这些事件的函数。它还通过after调用添加到队列的函数。

  

哪些陈述最终会出现在tkinter的主循环上?它只是3个tkinter声明吗?

没有什么“最终在tkinter的主循环上”。这是一个荒谬的陈述,没有任何东西可以最终结果。它只是一个处理事件的函数,在窗口被销毁之前不会返回。调用mainloop之前的所有代码都按照python的常规规则执行。

调用mainloop实际上就像将它放在适当位置一样(但效率更高):

while True:
    self.update()

与上面的内容非常相似,mainloop()之后的任何代码都不会执行,直到循环退出,这在窗口被销毁时发生。

在调用mainloop之后打印似乎有效但之前没有的原因仅仅是在mainloop之前,filename是空字符串。 print正常运行,只是没有什么可以打印的。该print语句在程序启动后几毫秒发生,在用户有机会做任何事情之前。在调用之后,它似乎有效,因为该代码在窗口被销毁之前不会运行。那时它可能有一个值,所以你看到印刷的东西。

答案 1 :(得分:1)

简单的答案是:mainloop收集的 no 类代码。

它是收集所有与Tcl解释器相关的配置,它是一种方法。如果您的GUI是const tree = { id:"x", name: "node 1", children : [ { id:"y", name:"sub node 1", children : [] } .... } 的配置,并且class Node extends Component { constructor(props) { super(props) this.setFocus = this.setFocus.bind(this) } setFocus(id) { if (this.props.node.id === id){ this.inputWidget.focus() return true } for (var i = 0; i < this.subNodes.length; i++) { const t = this.subNodes[i] const result = t.setFocus(id) if (result) { return true } } return false } render() { const { node } = this.props const children = node.children // we store the component sub nodes so that we can iterate over them this.subNodes = [] return (<div> <input type="text" ref={(input)=>{this.inputWidget = input}} {children.ma((n, index) => <Node key={n.id} node={n} ref={(main) => { this.subNodes.push(main) }} /> </div>) } } export default Node root = tk.Tk()的方法,那么其下的所有配置都将被计算在内,例如子窗口小部件及其配置。

您的mainloop声明未被吸收。如果从未使用过按钮,它只会打印出已打印的内容。只需使用按钮关闭GUI 而无需即可尝试第二个代码。 root不会吸收任何。它只是等待配置GUI的事件。