我撰寫了一個帶有影片的 tkinter 腳本,在 Xubuntu 上運行良好,但是當我在 Mac 上運行它時,影片不起作用。這是一個演示問題的小腳本:
import tkinter as tk
from time import sleep
root = tk.Tk()
canvas = tk.Canvas(root, height=200, width = 200)
canvas.pack()
this = canvas.create_rectangle(25,25, 75, 75, fill='blue')
that = canvas.create_rectangle(125, 125, 175, 175, fill = 'red')
def blink(event):
global this, that
for _ in range(9):
canvas.itemconfigure(this, fill='red')
canvas.itemconfigure(that, fill = 'blue')
canvas.update_idletasks()
sleep(.4)
this, that = that, this
canvas.bind('<ButtonRelease-1>', blink)
root.mainloop()
這會在畫布上繪制一個紅色方塊和一個藍色方塊。當用戶單擊畫布時,方塊會反復切換顏色。在 Xubuntu 上,它按預期作業。
在 Mac 上,當我單擊畫布時,我得到了旋轉的沙灘球,幾秒鐘后,我們看到方塊已經切換了顏色,因為它們在代碼中切換了奇數次顏色。
在我看來 update_idletasks 不起作用。有沒有辦法解決這個問題?我在 Big Sur 上運行帶有 Tk 8.6 的 python 3.9.5。
uj5u.com熱心網友回復:
我認為您可以做的是避免會阻止的任務mainloop,在這種情況下time.sleep()。所以你的代碼可以通過模擬for回圈來重新制作after,我看不到任何東西可以阻止這個通用代碼獨立于作業系統運行:
count = 0 # Think of this as the `_` in for _ in range(9)
def blink(event=None):
global this, that, count
if count < 9: # Basically repeats everytime `count` is less than 9, like a for loop
canvas.itemconfigure(this, fill='red')
canvas.itemconfigure(that, fill='blue')
this, that = that, this
count = 1 # Increase count
root.after(400,blink) # Repeat this code block every 400 ms or 0.4 seconds
else:
count = 0 # After it is 9, set it to 0 for the next click to be processed
uj5u.com熱心網友回復:
我發現使用update而不是update_idletasks在兩個平臺上都有效。不過,我的理解是后者更受歡迎。例如,請參閱此問題的已接受答案。這解決了我的直接問題,但是有人知道是否update_idletasks可以在 Mac 上作業嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/405176.html
標籤:
上一篇:系統無法驗證共享庫
