#python #tkinter #python-2.7
#python #tkinter #python-2.7
Вопрос:
Я пытаюсь создать свою первую программу с графическим интерфейсом. Проблема в том, что я не могу понять, как создать главное меню, которое переключалось бы на одну из программ после нажатия кнопки.
#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 довольно хорош.
2. @Blender: «лучше» — это субъективно. Tkinter довольно хорош для решения большинства задач, особенно при первом изучении. Для тех из нас, у кого за плечами большой опыт, tkinter по-прежнему остается очень выгодным выбором. На самом деле, только сегодня я решил отказаться от проекта, который я делал в wxPython, в пользу tkinter. Tkinter современный, хорошо поддерживаемый, кроссплатформенный и очень простой в использовании.
3. @Byran: Конечно, «лучше» — это субъективно. Я предлагал PyQt4 только потому, что он рисует элементы пользовательского интерфейса, похожие на собственные, и с ним было проще работать (для меня), чем с Tkinter.
Ответ №1:
- Вы можете вызвать pack_forget(), чтобы скрыть виджеты и (позже)
pack
снова показать их: - 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()
Комментарии:
1. Спасибо, но это не тот эффект, который я хотел получить. Что я хочу получить, так это то, что когда вы нажимаете кнопку, «Shuffle» открывается в том же окне, а не выскакивает из другого окна. На самом деле, строка меню хороша. Но возможно ли заставить его запускаться в том же окне вместо «всплывающего окна»?