假设我有像这样的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语句似乎被吸收了。
答案 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的事件。