2014-02-06 66 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