2017-06-22 39 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

因此,没有办法“暂停”执行一会儿时按住键来实现我想要的? –