2017-06-22 35 views
2

當我一直按住Ctrl+Up,我需要在標籤上的1000毫秒的間隔更新。 (如果我保持5,2秒Ctrl+Up下,命令應運行5次)。按住按鈕和窗口更新問題

after方法似乎並沒有這方面的工作。它還行爲怪異,就好像它記錄多少次,我按下了鍵,不斷循環,即使在Ctrl+Up是未按下。

from Tkinter import * 

root = Tk() 

def start(event): 
    global x 
    x = x+1 
    x_var.set(x) 
    root.after(1000, lambda: start(event)) 

x=1 

x_var=IntVar() 
x_var.set(x) 

r = Label(root, textvariable=x_var) 
r.pack() 

root.bind('<Control-Up>', start) 
root.mainloop() 

回答

1

這裏是運行一個命令每1000毫秒的方式同時舉行Ctrl +向上

  • 存儲和更新current pressed statuses的控制向上

  • 有一個.after()環自稱每1000毫秒,在其中運行所需的命令,如果兩個控制最多,當前按下。

代碼

import Tkinter as tk 

root = tk.Tk() 

x = 1 
x_var = tk.IntVar() 
x_var.set(x) 

r = tk.Label(root, textvariable=x_var) 
r.pack() 

isPressed = {"Control_L": False, "Up": False} 

def update_key_status(key, value): 
    global isPressed 
    isPressed[key] = value 

# Make the Press/Release events of both keys update the "isPressed" dictionary 
for key in ["Up", "Control_L"]: 
    root.bind('<KeyPress-{}>'.format(key), 
       lambda evt, key=key: update_key_status(key, True)) 
    root.bind('<KeyRelease-{}>'.format(key), 
       lambda evt, key=key: update_key_status(key, False)) 

def increment_x(): 
    global x, x_var 
    x += 1 
    x_var.set(x) 

def start(): 
    if (isPressed["Control_L"] and isPressed["Up"]): 
     increment_x() 
    root.after(1000, start) 

start() 
root.mainloop() 
+1

哦,那是我想要的方式。我使用Python 2.7,忘了說:x。我調整了Tk,它工作,我會更多地研究你在那裏做了什麼,謝謝。 –

1

的方法後,似乎並沒有這方面的工作。

不,它的工作方式與您的程序要求的一樣。

它還行爲怪異,就好像它記錄我多少次按下的鍵 並不斷循環,即使經過Ctrl +向上是未按下。

這不是很奇怪。扔一看給定documentation,你會閱讀:

回調只爲每次調用此方法調用一次。爲了保持 調用回調,需要重新註冊回調內部 本身

的粗體文字是什麼你到底在start()功能一樣。因此,當前代碼的邏輯行爲是,一旦您按Ctrl + 向上,該回調將等待1000毫秒執行,之後將繼續運行(直到您結束mainloop()事件)

因此,爲了使你的程序在您指定的鍵每次按下後增加標籤的內容只有一次,你需要避免以粗體顯示上面的設計。然後向溶液中可能包括在創造這樣一個特定的個漸進的功能:

def start(event):  
    root.after(1000, increment_x) 

所以,你的代碼變成:

def increment_x(): 
    global x, x_var 
    x += 1 
    x_var.set(x) 

然後你start()函數中使用此函數作爲回調

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

from Tkinter import * 

root = Tk()  

def start(event):  
    root.after(1000, increment_x) 

def increment_x(): 
    global x, x_var 
    x += 1 
    x_var.set(x) 


x=1 

x_var=IntVar() 
x_var.set(x) 

r = Label(root, textvariable=x_var) 
r.pack() 

root.bind('<Control-Up>', start) 
root.mainloop() 

PS請按照PEP8

+0

好了,但它仍然不能做我想做的。按住Ctrl + Up時,標籤每秒更新30次。當按住Ctrl + Up時,我想讓命令在1秒後運行一次。 –

+0

您必須按下**一次並釋放**鍵。否則,如果你持續按下按鍵(按住它們),你正在觸發事件綁定來執行,所以標籤的內容將快速增加並且繼續響應事件@MaiconErick –

+0

因此,沒有辦法「暫停」執行一會兒時按住鍵來實現我想要的? –