我正在創建一個具有兩個Toplevel小部件和根框架的GUI,我希望其中一個Toplevel小部件在啓動GUI時可以隱藏,但可以製作通過點擊根框架中的按鈕來看到。我可以插入該行:我如何使Toplevel小部件出現並消失
win2.withdraw()
在start_window代碼(構建整個GUI),這將使頂層窗口小部件不可見時的GUI初始化,但我無法弄清楚如何重新繪製一旦我希望它可見,Toplevel小部件。我所期望的命令:
win2.deiconify()
以提供所需的功能,但我得到以下錯誤消息當我嘗試這樣的:
AttributeError: start_window instance has no attribute 'deiconify'
這裏是我的代碼,當主循環()版,創建GUI。我在這段代碼中使用了兩個獨立的窗口小部件類,一個用於ScrolledList窗口小部件,另一個用於ScrolledText窗口小部件。它是我希望在啓動GUI時不可見的ScrolledText小部件,然後單擊使ScrolledText小部件可見的根框架上的按鈕。
class start_window(Frame):
def __init__(self, parent=None):
Frame.__init__(self, parent)
#self.pa()
Frame.pack(self)
win1 = Toplevel()
win2 = Toplevel()
Label(self, text = 'Bioasys DataBase', width = 30).pack()
btn = Button(self, text='Make Widget Visible', command=win2.master.deiconify())
btn.pack(side=TOP)
win1.title('Company Lookup')
win2.title('Company Information')
ScrolledList(win1).pack(side=TOP, fill=BOTH)
#stock_sym = 'acad'
#text1, text2 = create_company_information(stock_sym)
try:
stco_name = ScrolledText(win2, file=sys.argv[1], width= 50, height=15).pack()
except IndexError:
#text1 = 'Company Name - Company Symbol\n\nCompany URL\n\nCompany Address Line 1\nCompany Address Line 2\ncompany Address Line 3\nCompany Address Line 4'
stco_name = ScrolledText(win2, text= text1, width= 50, height=15).pack()
try:
stco_sym = ScrolledText(win2,file=sys.argv[1], width=50, height=15).pack()
except IndexError:
#text2 = 'Company Description'
stco_sym = ScrolledText(win2, text= text2, width=50, height=15).pack()
win2.withdraw() # makes the win2 frame invisible at startup
#win2.pack_forget()
#win2.master.deiconify()
這裏是兩個不同的Toplevel小部件的代碼,這些小部件類都正常工作。我包含此代碼,以便start_window類可以正常工作。
class ScrolledList(Frame):
def __init__(self, parent=None):
Frame.__init__(self, parent)
self.pack(expand=YES, fill=BOTH)
self.makeWidgets()
def handleList(self, event):
index = self.listbox.curselection()
label = self.listbox.get(index)
self.runCommand(label)
def fetch(self):
print 'Input => "%s"' % self.ent.get()
def makeWidgets(self):
self.ent = Entry(self)
btn = Button(self, text='ENTER', command=self.fetch)
sbar = Scrollbar(self)
list = Listbox(self, relief=SUNKEN)
self.ent.insert(0, 'Type Stock Symbol Here')
self.ent.pack(side=TOP, fill=X)
self.ent.focus()
self.ent.bind('<Return>', (lambda event: self.fetch()))
value = self.ent.get()
btn.pack(side=TOP)
sbar.config(command=list.yview)
list.config(yscrollcommand=sbar.set)
sbar.pack(side=RIGHT, fill=Y)
list.pack(side=LEFT, expand=YES, fill=BOTH)
options_init = open_pickled_company_list() #
options = [i[1] for i in options_init] #
for label in options:
list.insert('end', label)
#list.config(selectmode=SINGLE, setgrid=1)
list.bind('<Double-1>', self.handleList)
self.listbox = list
def runCommand(self, selection):
print 'You selected: ', selection
self.ent.delete(0, END)
self.ent.insert(0, selection)
class ScrolledText(Frame):
def __init__(self, parent=None, text='', file=None, width='', height=''):
Frame.__init__(self, parent)
self.pack(expand=YES, fill=BOTH) # make me expandable
self.width = width
self.height = height
self.makewidgets()
self.settext(text, file)
def makewidgets(self):
sbar = Scrollbar(self)
text = Text(self, relief=SUNKEN, width=self.width, height=self.height)
sbar.config(command=text.yview) # xlink sbar and text
text.config(yscrollcommand=sbar.set) # move one moves other
sbar.pack(side=RIGHT, fill=Y) # pack first=clip last
text.pack(side=LEFT, expand=YES, fill=BOTH) # text clipped first
self.text = text
def settext(self, text='', file=None):
if file:
text = open(file, 'r').read()
self.text.delete('1.0', END) # delete current text
self.text.insert('1.0', text) # add at line 1, col 0
self.text.mark_set(INSERT, '1.0') # set insert cursor
self.text.focus() # save user a click
def gettext(self): # returns a string
return self.text.get('1.0', END+'-1c') # first through last
這裏是intiates GUI中的主循環()命令:
start_window().mainloop()
因此,要總結,我開始尋找我的一個無形的Toplevel WIN2小部件界面,但通過點擊一個按鈕可以使Win2小部件的根框架可見。如果有人有任何想法如何做到這一點,我將不勝感激的幫助。
您好,感謝您的答覆。我知道start_window是一個Frame子類,因此(根據錯誤消息)沒有deiconify方法,我不知道該怎麼做是讓deiconify方法在我當前的代碼設置中工作。我是否需要不讓我的start_window類成爲Frame的子類?謝謝你的幫助。此致喬治 – user3798654 2014-12-04 15:15:44
錯誤消息可能是說「start_window實例沒有屬性'deiconify'」,但我使用的命令是「command = win2.master.deiconify()」(主部分是拼寫錯誤,我的命令是使用實際上是win2.deiconify())。所以我不明白我爲什麼指定win2,但錯誤消息是指定start_window。確實,我正在使用的按鈕/命令在start_window內,但是無法從根幀內控制Gui的一個方面(在這種情況下,start_window分爲Frame)?我感謝您的幫助。此致George – user3798654 2014-12-04 16:05:58
@ user3798654:您應該仔細檢查您的代碼。 Python錯誤通常不會說謊。如果它說'start_window.deiconify()'有錯誤,那麼可以肯定的是,這正是調用的代碼。 – 2014-12-04 16:25:40