У меня есть простой графический интерфейс, который использует привязки клавиш - что-то вроде этого.Python TkInter bind break
import Tkinter, tkFileDialog
class Foo(object):
def __init__(self, master):
master.bind('3', self.do_bar)
master.bind('9', self.load_new_config)
self.load_config()
if not self.conf:
self.load_new_config()
else:
self.load_data()
def load_config(self):
try:
self.conf = #get stuff from known file
except FailedToGetStuff:
self.conf = None
def load_new_config(self):
path = askopenfilename(initialdir='~')
self.conf = #get stuff from file in path
self.load_data()
def load_data(self):
#get data from self.conf, process and display
def do_bar(self):
#do stuff with displayed data
if __name__ == "__main__"
root = Tk()
Foo(root)
root.mainloop()
Теперь это прекрасно работает, когда load_config() находит то, что искал. Я могу использовать привязки и даже после использования «9» и загрузки новой конфигурации, все работает.
Проблема в том, что если load_config() терпит неудачу, self.conf получает значение None и load_new_conf получает вызов от __init__
, привязки больше не действуют.
Я понял, что проблема вызвана вызовом tkFileDialog.askopenfilename() изнутри __init__
. Я не понимаю, почему это происходит и как обойти это.
Вы проверили, что корень eindow имеет фокус, когда привязок перестают работать? Это может быть просто то, что ваше приложение теряет фокус. –
Использование 'master.focus_set()' в конце '__init__' для принудительного сосредоточения на корне не решило проблему. – Deutherius
Попробуйте следующее: 'foo = Foo (root)' – User