2017-07-16 38 views
0

所以使用tkinter我做了一個簡單的程序,它將畫布上所有形狀的顏色每秒都變爲隨機顏色,我正在尋找的是註冊每個畫面變化並記錄畫面之間時間的方法如果可能的話,我還需要在沒有太多外部庫的幫助下做到這一點。在python中註冊屏幕更改?

我迄今爲止代碼:

#!/usr/bin/python -W ignore::DeprecationWarning 
import Tkinter 
import tkMessageBox 
import time 
import random 


colors = ['DarkOrchid1','chocolate3','gold2','khaki2','chartreuse2','deep pink','white','grey','orange'] 
top = Tkinter.Tk() 
global b 
b=0 
C = Tkinter.Canvas(top, bg="blue", height=600, width=800) 
bcg1=C.create_rectangle(0,0,800,100,fill=random.choice(colors)) 
bcg2=C.create_rectangle(0,100,800,200,fill=random.choice(colors)) 
bcg3=C.create_rectangle(0,200,800,300,fill=random.choice(colors)) 
bcg4=C.create_rectangle(0,300,800,400,fill=random.choice(colors)) 
bcg5=C.create_rectangle(0,400,800,500,fill=random.choice(colors)) 
bcg6=C.create_rectangle(0,500,800,600,fill=random.choice(colors)) 
bcgs=[bcg1,bcg2,bcg3,bcg4,bcg5,bcg6] 
coord = 10, 50, 240, 210 
rect1=C.create_rectangle(0,0,100,100,fill="green") 
rect2=C.create_rectangle(700,500,800,600,fill="green") 
rect3=C.create_rectangle(0,500,100,600,fill="green") 
rect4=C.create_rectangle(700,0,800,100,fill="green") 
def color(): 
    global b 
    global bcgs 
    global color 
    if b==0: 
     C.itemconfig(rect1,fill='green') 
     C.itemconfig(rect2,fill='green') 
     C.itemconfig(rect3,fill='green') 
     C.itemconfig(rect4,fill='green') 
     b=1 
     count=0 
     for i in range(len(bcgs)): 
      C.itemconfig(bcgs[i],fill=random.choice(colors)) 

    elif b==1: 
     C.itemconfig(rect1,fill='red') 
     C.itemconfig(rect2,fill='red') 
     C.itemconfig(rect3,fill='red') 
     C.itemconfig(rect4,fill='red') 
     b=0 
     for i in range(len(bcgs)): 
      C.itemconfig(bcgs[i],fill=random.choice(colors)) 


    top.after(2000, color) 

C.pack() 
color() 
top.mainloop() 
+0

你是什麼意思 「屏變」?你有這個設置每2秒更換一次顏色,你的意思是你想驗證這需要2秒鐘才能完成? – Novel

+0

(在旁註中,您可能希望取消您的代碼,認爲'autopep8') – Grimmy

+0

是的,這正是我的目標,我想確認我沒有采取任何額外的時間,如果它確實有多少 – Alexanderp

回答

1

除非你使用一個實時操作系統,你將永遠不會得到完美的時機。你可以在離商標幾毫秒的時候存款。要看多少,你可以計算出time.time()的差異。爲獲得最佳準確度,請將after調用移至該函數中的第一件事。

那加上其他一些改進:

#!/usr/bin/python -W ignore::DeprecationWarning 
import Tkinter 
import time 
import random 
from itertools import cycle 

colors = ['DarkOrchid1','chocolate3','gold2','khaki2','chartreuse2','deep pink','white','grey','orange'] 
rect_colors = cycle(['green', 'red']) 

top = Tkinter.Tk() 
C = Tkinter.Canvas(top, bg="blue", height=600, width=800) 
bcg1=C.create_rectangle(0,0,800,100,fill=random.choice(colors)) 
bcg2=C.create_rectangle(0,100,800,200,fill=random.choice(colors)) 
bcg3=C.create_rectangle(0,200,800,300,fill=random.choice(colors)) 
bcg4=C.create_rectangle(0,300,800,400,fill=random.choice(colors)) 
bcg5=C.create_rectangle(0,400,800,500,fill=random.choice(colors)) 
bcg6=C.create_rectangle(0,500,800,600,fill=random.choice(colors)) 
bcgs=[bcg1,bcg2,bcg3,bcg4,bcg5,bcg6] 
coord = 10, 50, 240, 210 
rect1=C.create_rectangle(0,0,100,100,fill="green") 
rect2=C.create_rectangle(700,500,800,600,fill="green") 
rect3=C.create_rectangle(0,500,100,600,fill="green") 
rect4=C.create_rectangle(700,0,800,100,fill="green") 
rects = [rect1,rect2,rect3,rect4] 

last_time = time.time() 
def color(): 
    top.after(2000, color) 
    global last_time 

    rect_color = next(rect_colors) 
    for item in rects: 
     C.itemconfig(item, fill=rect_color) 
    for item in bcgs: 
     C.itemconfig(item, fill=random.choice(colors)) 

    print("{} seconds since the last run".format(time.time() - last_time)) 
    last_time = time.time() 

C.pack() 
color() 
top.mainloop() 
+0

謝謝對於答覆,時間的計算就像我想要的那樣,但是,這不就是測量這部分代碼執行的時間並將其與以前的時間進行比較嗎? 我不知道如何正確表達我所要做的,所以我會舉一個例子,假設你有一臺計算機出於某種原因有一個看似隨機的GUI延遲,所以我想測量這將花費的時間GUI在這種特殊情況下刷新tkinter窗口中的顏色進行更改。所以我要做的是確定像素是否已經改變了tkinter窗口。 – Alexanderp

+0

這測量從一次更新到下一次更新所花費的時間。如果你有一個GUI延遲,那麼它可能會出現在這裏,這取決於滯後來自何處。如果您通過RDP觀看,則不會記錄延遲。如果你的處理器鎖定,那麼它會。 – Novel

+0

是的,我是通過RDP watchig,但我認爲CPU在這裏沒有問題 – Alexanderp