如何在Tkinter中按下按钮

时间:2011-03-22 14:32:26

标签: python button tkinter listener

如何在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()

2 个答案:

答案 0 :(得分:1)

你想要完成的目标尚不清楚,但听起来你误解了GUI编程的工作原理并且只是提出错误的问题。一般来说,如果您认为需要轮询按钮而不是利用事件循环,那么您做错了。

因此,“如何监听按钮而不运行功能”的最佳答案是“你不能”。这有点像问“我怎么能用锤子将这个螺钉放在墙上?”。你可以,但这不是使用该工具的正确方法,所以出于所有实际目的,你不能也不应该教它如何。

在我看来,你正在制作一个猜谜游戏,我想你希望用户在每次猜测后按下向上或向下按钮。那是对的吗?如果是这样,为什么不只是让向上和向下按钮调用一个单一猜测的函数?

答案 1 :(得分:0)

您需要创建一个while not exiting行的循环,其中exiting在开始时声明为False,并在退出应用程序时切换。然后在该循​​环中,您可以放置​​检查特定状态的函数并更新其他状态。每次循环循环时,它将运行这些函数中的每一个。神奇的是让这些功能足够快,看起来它们不断运行。