如何在Tkinter中按下按钮?我需要听一个按钮而不是运行一个函数但是,我想运行一个监听按钮的函数。
更新 这是代码:
#!/usr/bin/env python
import time
import thread
from Tkinter import *
class at(Frame):
def __init__(self, *args, **params):
## Standard heading: initialization
apply(Frame.__init__, (self,) + args, params)
self._parent = None
if len(args) != 0: self._parent = args[0]
self._init_before()
self.v = StringVar()
## Widget creation
self._widgets = {}
self._widgets['button#1'] = Button(self, name='button#1', text='up',)
self._widgets['button#1'].grid(column=1, row=1)
self._widgets['entry#1'] = Entry(self, name='entry#1', textvariable=self.v)
self._widgets['entry#1'].grid(column=2, row=1)
self._widgets['button#2'] = Button(self, name='button#2', text='down',)
self._widgets['button#2'].grid(column=1, row=2)
## Scroll commands
## Resize behavior(s)
self.grid_rowconfigure(1, weight=0, minsize=30)
self.grid_rowconfigure(2, weight=0, minsize=31)
self.grid_columnconfigure(1, weight=0, minsize=30)
self.grid_columnconfigure(2, weight=0, minsize=65)
self.pack(side=TOP, fill=BOTH, expand=1)
## Call to post-init method
self._init_after()
def _init_before(self):
self._init_specificBefore()
def _init_after(self):
self._init_specificAfter()
def u(self):
if self.listening==True:
self.u=True
self.listening=False
def d(self):
if self.listening==True:
self.d=True
self.listening=False
def listen(self):
#listen for self.u and self.d
def _init_specificBefore(self):
pass
def _init_specificAfter(self):
range=[0,100]
current_guess=range[1]/2
n=1
x=""
while 1:
self.v.set(str(current_guess)+"?")
x=self.listen()
if x=="u":
range[0]=current_guess
if range[0]==0:
current_guess=round(current_guess+round(range[1]/2))
else:
current_guess=round(current_guess+round((range[1]-range[0])/2))
elif x=="d":
range[1]=current_guess
if range[0]==0:
current_guess=round(round(range[1]/2))
else:
current_guess=range[0]+(round((range[1]-range[0])/2))
elif x=="y":
print "It took me "+str(n)+" guesses."
break
n=n+1
if __name__ == '__main__':
root = Tk()
o = at(root)
o.pack(side=TOP, fill=BOTH, expand=1)
root.mainloop()
答案 0 :(得分:1)
你想要完成的目标尚不清楚,但听起来你误解了GUI编程的工作原理并且只是提出错误的问题。一般来说,如果您认为需要轮询按钮而不是利用事件循环,那么您做错了。
因此,“如何监听按钮而不运行功能”的最佳答案是“你不能”。这有点像问“我怎么能用锤子将这个螺钉放在墙上?”。你可以,但这不是使用该工具的正确方法,所以出于所有实际目的,你不能也不应该教它如何。
在我看来,你正在制作一个猜谜游戏,我想你希望用户在每次猜测后按下向上或向下按钮。那是对的吗?如果是这样,为什么不只是让向上和向下按钮调用一个单一猜测的函数?
答案 1 :(得分:0)
您需要创建一个while not exiting
行的循环,其中exiting在开始时声明为False,并在退出应用程序时切换。然后在该循环中,您可以放置检查特定状态的函数并更新其他状态。每次循环循环时,它将运行这些函数中的每一个。神奇的是让这些功能足够快,看起来它们不断运行。