2015-03-03 3 views
0

Я делаю простой графический интерфейс, который начинается с основного меню, которое пользователь может щелкнуть по кнопке, чтобы перейти в новое окно с изображением клавиатуры, и пользователь может нажать клавишу на своей клавиатуре, чтобы играть в paino. Прямо сейчас я не могу понять, как сделать кнопку, которая при нажатии закрывает главное меню (обозначается 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

edit: только что понял, что под функцией playGame он вызывает функцию gameMenu, которая не существует. Функция под ней, называемая playGame, должна называться gameMenu. –

+1

Так его нормально сейчас или нет? Пожалуйста, отредактируйте вопрос, если что-то изменилось. – Marcin

+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(), войти в основной цикл нечего было, это было потому, что вы пытались объявить 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. В будущем, вероятно, лучше спросить друга, который имеет опыт программирования, чтобы помочь в этом. Пообщайтесь на некоторых компьютерных форумах, я уверен, вы быстро найдете группу обмена и исправления кода.

+0

Если на этот вопрос был дан ответ, вы можете его закрыть –

Смежные вопросы