2012-01-18 58 views
1

如果這不是不言而喻的,我只編寫了python 2.7 tkinter大約四個月。據我所知,使用python窗口小部件

from Tkinter import* #access to libraries and widgets to write python code 
root=Tk() #creates CLI window that actually runs the module 
root.mainloop() #repeats the module code ad nauseum 
class = Class(root) #no clue what this actually does 

我已經寫了幾個簡單的單類模塊,即

from Tkinter import* 
class Code:  
    def __init__(self, parent): 
    self.myParent = parent  
    self.main_frame = Frame(parent, background="light blue")  
    self.main_frame.pack(expand=YES, fill=BOTH) 
    self.enter = Entry(self.main_frame, width=30)  
    self.enter.pack(side=LEFT, expand=NO) 
root = Tk() 
code = Code(root) 
root.mainloop() 

現在我已經跨過一個有趣的小掛件類運行在互聯網上 - 我已經剝離下來的要領 - 可以使枯燥的輸入窗口自動完成輸入窗口,即

import Tkinter 

class AutocompleteEntry(Tkinter.Entry): 

def set_completion_list(self, completion_list): 
    self._completion_list = completion_list 
    self._hits = [] 
    self._hit_index = 0 
    self.position = 0 
    self.bind('<KeyRelease>', self.handle_keyrelease)    

def autocomplete(self, delta=0): 
    if delta: 
     self.delete(self.position, Tkinter.END) 
    else: 
     self.position = len(self.get()) 
    _hits = [] 
    for element in self._completion_list: 
     if element.startswith(self.get().lower()): 
      _hits.append(element) 
      if _hits != self._hits: 
        self._hit_index = 0 
        self._hits=_hits 
    if _hits == self._hits and self._hits: 
      self._hit_index = (self._hit_index + delta) % len(self._hits) 
    if self._hits: 
      self.delete(0,Tkinter.END) 
      self.insert(0,self._hits[self._hit_index]) 
      self.select_range(self.position,Tkinter.END) 

def handle_keyrelease(self, event): 
    if len(event.keysym)== 1: 
     self.autocomplete() 

if __name__ == '__main__': 
    test_list = ('test', 'type', 'true', 'tree') 
    root = Tkinter.Tk() 
    entry = AutocompleteEntry(root) 
    entry.set_completion_list(test_list) 
    entry.pack() 
    entry.focus_set() 
    root.mainloop() 

這兩個做工精細獨奏,但我有幾個問題整合他們,而不是其中最重要的是區分從Tkinter導入*/root = Tk()和導入Tkinter/root = Tkinter.Tk()。我認爲這只是表達同一事物的兩種方式?對於代碼類,widget類組合來說,我需要哪個更大的框架來將這兩個組合在一起?我應該讓一個基類和其他繼承?我應該把它們疊在一起放兩根?我應該讓他們在一個更大的超級班上的兩個班?

修訂聯合CLASSES

from Tkinter import* 

class AutocompleteEntry(Entry): 

def set_completion_list(self, completion_list): 
    self._completion_list = completion_list 
    self._hits = [] 
    self._hit_index = 0 
    self.position = 0 
    self.bind('<KeyRelease>', self.handle_keyrelease)    

def autocomplete(self, delta=0): 
    if delta: 
     self.delete(self.position,END) 
    else: 
     self.position = len(self.get()) 
    _hits = [] 
    for element in self._completion_list: 
     if element.startswith(self.get().lower()): 
      _hits.append(element) 
      if _hits != self._hits: 
        self._hit_index = 0 
        self._hits=_hits 
    if _hits == self._hits and self._hits: 
      self._hit_index = (self._hit_index + delta) % len(self._hits) 
    if self._hits: 
      self.delete(0,END) 
      self.insert(0,self._hits[self._hit_index]) 
      self.select_range(self.position,END) 

def handle_keyrelease(self, event): 
    if len(event.keysym)== 1: 
     self.autocomplete() 

class Code: 
def __init__(self, parent): 
    self.myParent = parent 
    self.main_frame = Frame(parent, background="light blue") 
    self.main_frame.pack(expand=YES, fill=BOTH) 

    test_list = ('test', 'type', 'true', 'tree') 

    self.enter = AutocompleteEntry(self.main_frame, width=30) 
    self.enter.set_completion_list(test_list) 
    self.enter.pack(side=LEFT, expand=NO) 

root = Tk() 
code = Code(root) 
root.mainloop() 

回答

0

from Tkinter import *; root=Tk()import Tkinter; root=Tkinter.Tk()更多或更少的兩分表達了同樣的事情的方式。至少,都給你一個根窗口。但是,它們並不完全相同。前者將大量東西輸入名稱空間,後者只輸入一件東西。

我在網上看到很多例子,from Tkinter import *,但我認爲這是一個壞主意。我的首選是import Tkinter as tk其中(a)不污染命名空間,(b)升級到python 3時需要最小的更改,(c)當您調用Tkinter函數時,以及當您不需要時,它會非常清楚。

至於你有兩個根的問題......不,不要那樣做。您只能在應用程序中擁有一個Tk類的單個實例。要將它們一起使用,可以分別導入它們(即:不要將它們複製並粘貼到單個文件中),否則您將不得不修改其中一個,以便它們使用相同的導入策略。

+0

當你將import Tkinter作爲tk使用時,是否將所有self.somethings改爲tk.somethings,或者只要我聲明瞭def __init __(self,parent),self.something仍然可以在類中工作? – Jeff 2012-01-19 13:49:17

+0

@Jeff:不要改變你的「self.somethings」。你必須改變的是任何對Tk類或值的引用。例如,而不是'foo = Button(...)',你可以做'foo = tk.Button(...)'。 – 2012-01-19 16:49:56

相關問題