2014-12-04 80 views
0

我正在創建一個具有兩個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小部件的根框架可見。如果有人有任何想法如何做到這一點,我將不勝感激的幫助。

回答

0

您寫道:

I expected the command: win2.deiconify() to provide the desired functionality but I get the following error message when I attempt this:

AttributeError: start_window instance has no attribute 'deiconify'

你說的什麼錯誤消息說的是兩回事。你不打電話win2.deiconify()而是start_window.deiconify()

win2.deiconify()確實是你如何做一個不可見的頂級窗口可見,假設win2是的Toplevel實例的引用。

該解決方案涉及保存對頂級窗口的引用,以便您可以在回調中引用它。例如:

類start_window(幀): DEF 初始化(自我,父母=無): ... self.win2 = Toplevel爲() ... BTN =按鈕(個體經營,文本='Make Widget Visible',command = self.win2.deiconify)

您的代碼中存在另一個細微的錯誤。請注意,在原始代碼中您有command=self.win2.master.deiconif())command屬性採用對函數的引用。相反,您正在調用deiconify方法,並且返回的任何內容都將被分配給command屬性。你有自我進一步的複雜性。win2沒有master屬性。

的解決方案是將command屬性設置爲self.win2(如:command=self.win2.deiconify)

+0

您好,感謝您的答覆。我知道start_window是一個Frame子類,因此(根據錯誤消息)沒有deiconify方法,我不知道該怎麼做是讓deiconify方法在我當前的代碼設置中工作。我是否需要不讓我的start_window類成爲Frame的子類?謝謝你的幫助。此致喬治 – user3798654 2014-12-04 15:15:44

+0

錯誤消息可能是說「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

+0

@ user3798654:您應該仔細檢查您的代碼。 Python錯誤通常不會說謊。如果它說'start_window.deiconify()'有錯誤,那麼可以肯定的是,這正是調用的代碼。 – 2014-12-04 16:25:40