Вы должны простить меня за удаление своего класса, но я никогда лично работал с классами в 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()
, войти в основной цикл нечего было, это было потому, что вы пытались объявить root = Tk()
внутри gameMenu, который не вызывался в вашей программе.
Если вы хотите, чтобы открыть окна в 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
Этот небольшой скрипт просто рисует экран с двумя кнопками, один рисует новый экран с текстом «Темп» на нем, а другая кнопка закрывает окно master
. В будущем, вероятно, лучше спросить друга, который имеет опыт программирования, чтобы помочь в этом. Пообщайтесь на некоторых компьютерных форумах, я уверен, вы быстро найдете группу обмена и исправления кода.
edit: только что понял, что под функцией playGame он вызывает функцию gameMenu, которая не существует. Функция под ней, называемая playGame, должна называться gameMenu. –
Так его нормально сейчас или нет? Пожалуйста, отредактируйте вопрос, если что-то изменилось. – Marcin
Нет, он все еще дает мне ошибку, что «корень» не определен. –