2017-02-09 2 views
0

Я использую Python 3 и Tkinter, и у меня есть функция wait(), ожидая, пока не будет нажата клавиша со стрелкой вправо или клавиша со стрелкой влево, однако она просто замерзает все, и мне нужно заставить остановить программу.Tkinter Подождите, пока клавиша будет нажата

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() работать, как предполагается, или мне нужно найти другой путь?

+2

Почему нужно ждать? По умолчанию графический интерфейс постоянно находится в состоянии ожидания. Просто введите код, который вы хотите запустить в 'setLeft' и' setRight' –

+0

@BryanOakley. Я хочу дождаться нажатия любой клавиши, а затем выяснить, какой из них был, чтобы я мог настроить дерево. – nedla2004

+0

Но вы знаете, какой из них был нажат: если вызывается 'setLeft', была нажата стрелка влево. –

ответ

0

Да, вам нужен другой способ из-за управляемого событиями программирования TKinter GUI. Когда какое-то событие приведет вас к вашей функции wait(), это будет: вы застряли в бесконечном цикле, и вы больше не сможете выйти на улицу!

Как @Bryan Oakley pointed - 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() 
Смежные вопросы