要理解我的問題,請遵循以下段落:
主回圈無限處理什么代碼?就像它一遍遍地讀取整個程式的代碼?考慮代碼:
from tkinter import *
window = Tk()
print("lol")
print("Hello World")
window.mainloop()
輸出沒有無限次列印“Hello World”或“lol”,因此 mainloop() 不會回圈當前模塊的代碼。
現在考慮這段代碼:
from tkinter import *
print("lol")
window = Tk()
print("Hello World")
while True:
window.update()
現在,即使這段代碼執行相同的輸出,所以現在我們可以考慮 mainloop() 回圈代碼“window.update()”無限次,但更有效(不知何故)。
現在第一個問題出現了 window.update() 函式如何更新 GUI 中的值,它是否再次從上到下重新讀取代碼,或者更新函式如何更新 GUI 小部件值。
第二個問題是:
我讀了這篇文章
“Python Tkinter 中的主回圈是應用程式視窗的無限回圈,它永遠運行,因此我們可以看到靜止的螢屏。應用程式視窗就像一個框架,每微秒都在不斷破壞,但主回圈不斷創建一個新的更新視窗。銷毀舊窗紗并創建新窗紗的程序發生得如此之快,以至于人眼甚至都沒有意識到。由于該程序運行無限時間,這就是為什么我們能夠看到我們面前的應用程式以及當我們關閉應用程式時視窗然后回圈終止或退出。”
現在,如果這是真的,那么要重新創建一個更新的視窗,root.mainloop() 必須一次又一次地完全讀取整個根 GUI 代碼,或者是否有其他解釋。
在過去的 6 小時里,我一直在努力理解這一點,并且我訪問了每個站點,但我找不到適合我生活的解決方案。
問候, 拉希克
uj5u.com熱心網友回復:
主回圈無限處理什么代碼?就像它一遍遍地讀取整個程式的代碼?
不。
通過這個函式,它呼叫這個有嵌入式 Tcl 解釋器處理一個事件的 C 代碼Tkinter_busywaitinterval,或者在嘗試處理另一個事件之前等待
現在,即使這段代碼執行相同的輸出,所以現在我們可以考慮 mainloop() 回圈代碼“window.update()”無限次,但更有效(不知何故)。
window.update()呼叫TCLupdate,它被描述為
[...] 通過反復進入事件回圈直到所有未決事件(包括空閑回呼)都已處理,使應用程式“更新”。
你的無限回圈沒有睡眠,所以它盡可能地旋轉你的 CPU,幾乎什么都不做。
[...]它是否再次從上到下重新讀取代碼,或者更新功能如何更新 GUI 小部件值。
它當然不會重新讀取您的代碼。它處理任何掛起的小部件更新,這可能是通過運行例如window.text("...")點擊回呼或.after()超時等而發生的。
我讀了這篇文章 [...]
那篇文章似乎是錯誤的和/或至少過度簡化了事情。
這個簡單的示例時鐘應該闡明事情是如何作業的:
import time
import tkinter as tk
root = tk.Tk()
text = tk.Label(root)
text.pack()
def tick():
text["text"] = time.ctime() # update `text` widget's content
root.after(1000, tick) # schedule for this function to be called after 1 second
if __name__ == '__main__':
tick() # call the `tick` function once before entering main loop
root.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/414743.html
標籤:
