我正在制作一个以主菜单开头的简单GUI,用户可以点击按钮进入一个新窗口,其中有一个键盘图片,用户可以按键盘上的键来播放画面。现在我无法弄清楚如何按下按钮关闭主菜单(标记为mainMenu())并打开游戏菜单(playGame)。
import tkinter
from tkinter import *
class mainMenu:
def _init_(self, master):
frame = Frame(master)
frame.pack()
self.quitButton = Button(frame, text = "Quit", command = frame.quit)
self.quitButton.pack(side = LEFT)
self.proceedButton = Button(frame, text = "Play", command = playGame)
self.proceedButton.pack(side = LEFT)
def playGame(self):
frame.quit
gameMenu()
def gameMenu(self):
root = Tk()
b = mainMenu(root)
topFrame = Frame(root)
topFrame.pack()
bottomFrame = Frame(root)
bottomeFrame.pack(side = BOTTOM)
photo = PhotoImage(file = "piano.png")
label = Label(root, image = photo)
label.pack()
root.mainloop()
答案 0 :(得分:0)
你必须原谅我删除你的课程,但我以前从未亲自在python中使用过类。但是我似乎让你的代码在某种程度上起作用。
import tkinter
from tkinter import *
def playGame():
frame.quit
gameMenu()
def gameMenu():
b = mainMenu(root)
topFrame = Frame(root)
topFrame.pack()
bottomFrame = Frame(root)
bottomFrame.pack(side = BOTTOM)
photo = PhotoImage(file = "piano.png")
label = Label(root, image = photo)
label.pack()
root=Tk()
frame = Frame(root)
frame.pack()
quitButton = Button(frame, text = "Quit", command = frame.quit)
quitButton.pack(side = LEFT)
proceedButton = Button(frame, text = "Play", command = playGame)
proceedButton.pack(side = LEFT)
root.mainloop()
您遇到的主要问题是您同时使用root
和master
。在tkinter中声明主窗口时,您通常使用root = Tk()
或master = Tk()
,其中一个是可接受的,我个人使用master
。此变量包含放置其他所有内容的主窗口。您还没有将Tk()
放入任何变量,这意味着当您点击root.mainloop()
时没有任何内容可以进入主循环,这是因为您试图在gameMenu中声明root = Tk()
,在你的程序中没有被调用。
如果你想在tkinter中打开窗口,可能更容易编写这样的东西:
from tkinter import *
master = Tk() #Declaring of main window
def ProceedButtonCommand(mainframe, master): #Command to attach to proceed button
mainframe.destroy()
DrawSecondScreen(master) #This line is what lets the command tied to the button call up the second screen
def QuitButtonCommand(master):
master.destroy()
def DrawFirstScreen(master):
mainframe = Frame(master) #This is a way to semi-cheat when drawing new screens, destroying a frame below master frame clears everything from the screen without having to redraw the window, giving the illusion of one seamless transition
ProceedButton = Button(mainframe, text="Proceed", command=lambda: ProceedButtonCommand(mainframe, master)) #Lambda just allows you to pass variables with the command
QuitButton = Button(mainframe, text = "Quit", command=lambda: QuitButtonCommand(master))
mainframe.pack()
ProceedButton.pack()
QuitButton.pack()
def DrawSecondScreen(master):
mainframe = Frame(master)
Label1 = Label(mainframe, text="Temp")
mainframe.pack()
Label1.pack()
DrawFirstScreen(master)
master.mainloop() #The mainloop handles all the events that occur in a tkinter window, from button pressing to the commands that a button runs, very important
这个小脚本只是绘制一个带有两个按钮的屏幕,一个绘制一个带有文本“temp”的新屏幕,另一个按钮关闭master
窗口。
在将来,要求有编程经验的朋友帮助解决这类问题可能是个更好的主意。在一些计算论坛上讨论,我相信你会找到一组快速共享和修复代码。