t等待按键按下

2024-09-30 14:15:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python3和Tkinter,我有一个wait()函数,等待右箭头键或左箭头键被按下,但是,它只是冻结了所有东西,我不得不强制停止程序。在

from tkinter import *

right = left = False

def setLeft(event):
    global left
    left = True
    print('Left!')
def setRight(event):
    global right
    right = True
    print('Right!')

def wait():
    global right, left
    left = right = 0
    while not (left or right):
        pass
    print(right) #0 for left, 1 for right
    left = right = 0


root = Tk()
root.bind('<Left>', setLeft)
root.bind('<Right>', setRight)

有没有办法让wait()函数像它所期望的那样工作,或者我需要找到另一种方法吗?在


Tags: 函数righteventtruedefrootleftglobal
1条回答
网友
1楼 · 发布于 2024-09-30 14:15:47

是的,您需要一种不同的方式,因为Tkinter GUI编程的事件驱动性质。当某个事件将你带到你的wait()函数时,它就在那里:你被困在无限循环中,你再也不能用事件走出去了!在

因为@bryanoakleypointed-GUI在默认情况下一直处于等待状态,因为您到达了mainloop()。我认为,当用户在一个树中导航时,除了这两个(左键和右键)外,您试图抑制所有其他事件(或只是导航键)。在

下面是一个小例子:

import tkinter as tk


# Main - application
class App(tk.Tk):
    # init of our application
    def __init__(self, *args, **kwargs):
        tk.Tk.__init__(self, *args, **kwargs)
        self.minsize(width=450, height=100)
        self.wm_title('Just another example from SO')
        self.wait_state = False
        self.init_events()

    # switch state
    def switch_wait_state(self, event):
        self.wait_state = not self.wait_state
        print('Wait state switched to: %s ' % self.wait_state)

    # init events
    def init_events(self):
        self.bind('<Key>', self.wait)
        self.bind('<Control-s>', self.switch_wait_state)

    # waiter(listener) for keypress
    def wait(self, event):
        if self.wait_state and any(key == event.keysym for key in ['Left', 'Right']):
            print('I have successfully waited until %s keypress!' % event.keysym)
            self.do_smth(event.keysym)
        else:
            print('Wait state: %s , KeyPress: %s' % (self.wait_state, event.keysym))
            self.do_nhth()

    @staticmethod
    def do_smth(side):
        print("Don't be rude with me, Im trying my best on a %s side!" % side)

    @staticmethod
    def do_nhth():
        pass


app = App()
app.mainloop()

相关问题 更多 >

    热门问题