2011-10-22 67 views
1

我正在嘗試製作我的第一個GUI程序。問題是,我無法弄清楚如何製作一個主菜單,點擊一個按鈕後,它將切換到其中一個程序。Tkinter(python 2.7.2)需要的幫助

#Dev by Mkee 
from Tkinter import * 
import tkMessageBox 
#Main Stuff 
app = Tk() 
app.title("Mkee's Tools") 
app.geometry('300x200') 

#modules 
class Programs: 
    def Shuffle(): 
     app2 = Tk() 
     app2.title("Shuffle") 
     app2.geometry('300x200') 
     app2.mainloop() 


#end of modules 

labelText = StringVar() 
labelText.set('') 
label1 = Label(app, textvariable=labelText, height=4) 
label1.pack() 

button1 = Button(app, text='Shuffle', width=30, command=Programs.Shuffle) 
button1.pack(side='right', padx=5,pady=1) 


app.mainloop() 

我知道我做錯了。我只是不知道該怎麼做,所以我試了一下它怎麼可能。請幫幫我。

+1

不是一個答案,但你看着一個更好的GUI工具包? PyQt4相當不錯。 – Blender

+1

@Blender:「更好」是主觀的。 Tkinter對於大多數問題都非常好,特別是在初次學習時。對於我們這些擁有豐富經驗的人來說,tkinter仍然是一個非常可行的選擇。事實上,就在今天,我決定放棄我一直在wxPython中贊成tkinter的項目。 Tkinter是現代化的,支持良好的跨平臺,並且非常易於使用。 –

+0

@Byran:當然,「更好」是主觀的。我只是建議使用PyQt4,因爲它繪製了本地化的UI元素,並且比Tkinter更適合(對我而言)。 – Blender

回答

1
  1. 你可以稱之爲pack_forget()隱藏窗口小部件,以及(後來) pack再次展示他們:

  2. Tkinter的是單線程,和mainloop運行主事件循環。因此您不應該撥打mainloop兩次。


#Dev by Mkee 
import Tkinter as tk 
import sys 

class Shuffle(object): 
    def __init__(self,master=None): 
     self.master=master 
     self.text=tk.Text(master) 
    def hide(self): 
     self.text.pack_forget() 
    def show(self): 
     self.text.pack(side=tk.LEFT, padx=5, pady=5) 

class Buttons(object): 
    def __init__(self,master=None): 
     self.master=master 
     self.red = tk.Button(self.master, text="Red", bg="red", fg="white") 
     self.green = tk.Button(self.master, text="Green", bg="green", fg="black") 
     self.blue = tk.Button(self.master, text="Blue", bg="blue", fg="white") 
    def hide(self): 
     self.red.pack_forget() 
     self.green.pack_forget() 
     self.blue.pack_forget()     
    def show(self): 
     self.red.pack(side=tk.LEFT,expand=tk.YES,fill=tk.BOTH) 
     self.green.pack(side=tk.LEFT,expand=tk.YES,fill=tk.BOTH) 
     self.blue.pack(side=tk.LEFT,expand=tk.YES,fill=tk.BOTH) 

class MainApp(object): 
    def __init__(self,master=None): 
     self.master=master 
     app=self.app=tk.Tk() 
     app.title("Mkee's Tools") 
     app.geometry('300x200') 
     self.shuffle=Shuffle(master) 
     self.buttons=Buttons(master) 
     self.current=None 
     menubar=tk.Menu(app) 
     program_menu=tk.Menu(menubar) 
     program_menu.add_command(label='Shuffle', 
           command=lambda: self.show(self.shuffle)) 
     program_menu.add_command(label='Buttons', 
           command=lambda: self.show(self.buttons)) 
     program_menu.add_command(label='Quit',command=sys.exit) 
     menubar.add_cascade(label='Programs', menu=program_menu) 
     app.config(menu=menubar) 
    def show(self,obj): 
     if self.current != obj: 
      try: self.current.hide() 
      except AttributeError: pass 
      self.current=obj 
      obj.show() 

def main(): 
    m=MainApp() 
    m.app.mainloop() 

if __name__=='__main__': 
    main() 
+0

謝謝,但這不是我想要得到的效果。我想得到的是當你按下按鈕時,「Shuffle」在同一個窗口中打開,而不是彈出另一個窗口。 其實,菜單欄很好。但有可能讓它運行在相同的窗口而不是「彈出」? – Thurax