2014-02-06 65 views
1

我有一个简单的GUI使用键绑定 - 这样的事情。Python TkInter绑定破解

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,并且从__init__调用load_new_conf,则绑定不再可用。

我发现问题是由__init__内调用tkFileDialog.askopenfilename()引起的。我不明白的是为什么会发生这种情况,以及如何解决这个问题。

+0

您已经验证根eindow具有焦点时绑定停止工作?这可能只是因为你的应用失去了重点。 –

+0

在'__init__'结尾处使用'master.focus_set()'强制关注根目录并不能解决问题。 – Deutherius

+0

试试这个:'foo = Foo(root)' – User

回答

0

此代码的工作对我来说:

import Tkinter, tkFileDialog 

class Foo(object): 
    def __init__(self, master): 
     master.bind('<KeyPress-3>', self.do_bar) 
     master.bind('<KeyPress-9>', self.load_new_config) 

     self.load_config() 

     if not self.conf: 
      master.after(1, self.load_new_config) 
     else: 
      self.load_data() 

    def load_config(self): 
     try: 
      self.conf = None#get stuff from known file 
     except FailedToGetStuff: 
      self.conf = None 

    def load_new_config(self, e = 0): 
     path = tkFileDialog.askopenfilename(initialdir='~') 
     self.conf = None#get stuff from file in path 
     self.load_data() 

    def load_data(self, e = 0): 
     pass 
     #get data from self.conf, process and display 

    def do_bar(self, e = 0): 
     print 1 
     #do stuff with displayed data 

if __name__ == "__main__": 
    root = Tkinter.Tk() 
    Foo(root) 
    root.mainloop() 
+0

是的,这就是我最终做到的 - 只是等待用户输入。然而,这不是我的预期行为,我希望程序自动请求新的配置。 – Deutherius

+0

编辑它。现在它也适用于我在启动时。在主循环启动时启动对话框的关键是:'master.after(1,self.load_new_config())' – User

+0

非常感谢,这可以工作。但是,我会建议一个更改:'master.after(1,self.load_new_config)'而不是'master.after(1,self.load_new_config())'。否则,它不会等待指定的时间并立即调用该函数。 – Deutherius