2014-12-22 13 views
-1

我想顯示列表框的選定項目的文本到畫布中。當我將列表框綁定到輔助事件處理程序時,它會拋出屬性錯誤:CLASS對象沒有「HELPER EVENT HANDLER」屬性。如何使用Python3x tkiner在畫布中顯示列表框項目的文本?

我要的是如下:

1)雙擊列表框中的左側有一個項目,它的文本應顯示在畫布上。這一行代碼給我造成了所有的麻煩。

lstbox.bind("<Double-Button-1>", self.OnDouble) 

你能幫我解決這個錯誤嗎?

2)我相信必須有一種方法可以使列表框上的行高度大於它在我的應用程序中出現的高度。但是,我不知道該怎麼做。我試過提供幾個選項,但這些選項不被tkinter識別。你能告訴我怎麼做嗎?

下面是代碼:

import tkinter as tk 
languages = ['Mandarin', 'English', 'French'] 
class LanguageFamilies(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     canv = tk.Canvas(self, width=675, height=530, bg="white", relief="sunken") 
     canv.config(scrollregion=(0,0,300,650), highlightthickness=0) 
     canv.pack(side="right", expand=True, fill="both") 

     # Create scroll bar 
     sbar = tk.Scrollbar(self) 
     canv.config(yscrollcommand=sbar.set) 
     sbar.config(command=canv.yview) 
     sbar.pack(side="right", fill="both") 

     # Create Scroll List 
     lstbox = tk.Listbox(self, width=240, height=530, relief="sunken", font="Courier") 
     lst_scrollbar = tk.Scrollbar(self) 
     lstbox.config(yscrollcommand=lst_scrollbar.set) 
     lst_scrollbar.config(command=lstbox.yview) 
     lstbox.pack(side="left", expand=True, fill="both") 
     lst_scrollbar.pack(side="right", fill="both") 
     lstbox.bind("<Double-Button-1>", self.OnDouble) # THIS IS THE LINE CAUSING THE ERROR 

     # Add items to the lstbox 
     i = 0 
     while i < len(languages): 
      lstbox.insert(i, languages[i]) 
      i += 1 

     # Create a text inside canvas 
     canv_id = canv.create_text(50, 50, font="Times 14", anchor="nw") 
     msg = "This is a text inside canvas." 
     canv.insert(canv_id, "end", msg) 

     #Binding Handler 
     def OnDouble(self, event): 
      self.widget = event.widget 
      selection = self.widget.curselection() 
      content = self.widget.get(selection[0]) 
      print("You selected", content) 



if __name__ == "__main__": 
    root = tk.Tk() 
    root.geometry("930x530") 
    root.title("Language Families") 
    LanguageFamilies(root).pack(fill="both", expand=True) 
    root.mainloop() 

這是錯誤消息:

Traceback (most recent call last): 
File "C:/Python33/new_stack_overflow.py", line 43, in <module> 
LanguageFamilies(root).pack(fill="both", expand=True) 
File "C:/Python33/new_stack_overflow.py", line 23, in __init__ 
lstbox.bind("<Double-Button-1>", self.OnDouble) 
AttributeError: 'LanguageFamilies' object has no attribute 'OnDouble' 

你的幫助是非常感謝!

+0

你ndentation看起來很奇怪。你的'__init__'函數只有一行,其餘的是縮進的。那是故意的嗎?也許這是原因。還有其他縮進錯誤 - 與'def'語句在同一級別上進行編碼。也許你有一個標籤和空格的混合體,使得代碼看起來不同於你的計算機。 –

+0

@BryanOakley,非常感謝您的評價。我認爲縮進問題是由將代碼複製到Web瀏覽器造成的。我已經從谷歌驅動器共享代碼。請在此處查看:https://drive.google.com/file/d/0Bzk3iitPNBruYnpKMFF4b1Fhbzg/view?usp=sharing先謝謝您! – Mohammed

+0

請修復問題中的代碼。谷歌驅動器或該文件可能並不總是在附近。 –

回答

-1

這裏是完整和正確的答案!以下是解決問題的階段。

  1. 布萊恩的一個級別降低OnDouble事件處理程序的壓痕的建議是第一步驟的解決。

  2. 我從這次經驗中學到的關鍵是直接在畫布上打印列表框的文本不是正確的選項。相反,最好的選擇是在畫布上放置文本小部件,以便操縱文本問題將更容易。我看了一個不錯的視頻教程here後得出了這個結論。同樣,文本小部件被定義在畫布的頂部。 if條件用於控制在文本畫布上打印的內容以及打印的次數 - (在這種情況下,僅與電子詞典完全相同 - 這是我的應用程序)。

下面是完整的工作代碼:

import tkinter as tk 
languages = ['Mandarin', 'English', 'French'] 
global counter 
counter = 1 
class LanguageFamilies(tk.Frame): 
    def __init__(self, *args, **kwargs): 
     tk.Frame.__init__(self, *args, **kwargs) 
     global canv, canv_id # IN ORDER TO MAKE THEM ACCESSIBLE TO OnDouble EVENT HANDLER 
     canv = tk.Canvas(self, width=675, height=530, bg="white", relief="sunken") 
     canv.config(scrollregion=(0,0,300,650), highlightthickness=0) 
     canv.pack(side="right", expand=True, fill="both") 

     # Create scroll bar 
     sbar = tk.Scrollbar(self) 
     canv.config(yscrollcommand=sbar.set) 
     sbar.config(command=canv.yview) 
     sbar.pack(side="right", fill="both") 

     # Create Scroll List 
     lstbox = tk.Listbox(self, width=240, height=530, relief="sunken", font="Courier") 
     lst_scrollbar = tk.Scrollbar(self) 
     lstbox.config(yscrollcommand=lst_scrollbar.set) 
     lst_scrollbar.config(command=lstbox.yview) 
     lstbox.pack(side="left", expand=True, fill="both") 
     lst_scrollbar.pack(side="right", fill="both") 
     lstbox.bind("<Double-Button-1>", self.OnDouble) 

     # Add items to the lstbox 
     i = 0 
     while i < len(languages): 
      lstbox.insert(i, languages[i]) 
      i += 1 

     # Create a text inside canvas 
     global textmatter 
     textmatter = tk.Text(canv) # THE TEXT SHOULD BE PRINTED ON THE CANVAS 
     textmatter.insert("end", "Double-click on a language on the left to view information.") 
     textmatter.pack() 



    #Binding Handler, ONE INDENTATION LEVEL IS REMOVED AS PER BRYAN'S SUGGESTION 
    def OnDouble(self, event): 
     global counter 
     self.widget = event.widget 
     selection = self.widget.curselection() 
     content = self.widget.get(selection[0]) 
     if counter == 1: 
      textmatter.delete(1.0, "end") # CLEAR THE TEXT WHICH IS DISPLAYED AT FIRST RUNNING 
      textmatter.insert("end", content) 
      counter += 1 #ONE ITEM HAS BEEN SELECTED AND PRINTED SUCCESSFULLY 
     elif counter > 1: 
      textmatter.delete(1.0, "end") 
      textmatter.insert("end", content) 
      counter = 1 # RESET THE COUNTER SO THAT NEXT SELECTED ITEM DISPLAYS PROPERLY 





if __name__ == "__main__": 
    root = tk.Tk() 
    root.geometry("930x530") 
    root.title("Language Families") 
    LanguageFamilies(root).pack(fill="both", expand=True) 
    root.mainloop() 

這就是它。我希望這篇文章能對你有所幫助!

薩拉姆

穆罕默德

+0

在畫布中打包文本小部件是非常不尋常的。我甚至不知道你爲什麼使用畫布。此外,如果您使用的是類,則沒有理由使任何變量成爲全局變量 - 它們可以是類的屬性。 –

+0

@BryanOakley我不是一個專業的程序員。我是語言學的博士生。但我對自己學習編程很感興趣,因爲我的博士學位需要一些程序。項目。我可以讓一個專業的程序員爲我設計軟件,但如果我不知道這些軟件是否有效,那有什麼好處。我通過coursera網站在線學習了Python。我不是像你或你的同齡人一樣的專業程序員。無論如何,我非常感謝您與我的博文的互動。他們非常有幫助。 – Mohammed

1

的問題是,對於OnDouble的DEF定義內部__init__,使得它不是一個類方法但__init__範圍內的方法。您需要刪除OnDouble的一個縮進級別。

+0

謝謝你的建議,布賴恩!我刪除了原始代碼上的編輯。現在拋出錯誤的是相同的。此外,我一直試圖讓文字印刷在畫布上,直到我能夠做到,儘管笨拙。我已經發布了代碼作爲我自己的問題。再次感謝你和聖誕快樂! – Mohammed

+0

最後,我可以修復代碼並根據需要獲取打印在畫布上的文本。非常感謝你的幫助!聖誕節快樂! – Mohammed

相關問題