如果這不是不言而喻的,我只編寫了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()
當你將import Tkinter作爲tk使用時,是否將所有self.somethings改爲tk.somethings,或者只要我聲明瞭def __init __(self,parent),self.something仍然可以在類中工作? – Jeff 2012-01-19 13:49:17
@Jeff:不要改變你的「self.somethings」。你必須改變的是任何對Tk類或值的引用。例如,而不是'foo = Button(...)',你可以做'foo = tk.Button(...)'。 – 2012-01-19 16:49:56