2015-03-03 202 views
0

我正在製作一個簡單的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

編輯:剛剛意識到,在playGame函數下,它會調用不存在的函數gameMenu。它下面稱爲playGame的功能應該稱爲gameMenu。 – 2015-03-03 02:01:28

+1

所以它現在好嗎?如果事情發生了變化,請編輯問題。 – Marcin 2015-03-03 02:04:03

+0

不,它仍然給我一個'root'沒有定義的錯誤。 – 2015-03-03 02:11:06

回答

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() 

你有主要的問題是,你是同時使用rootmaster。在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 

這個小腳本只是繪製包含兩個按鈕的屏幕,一個繪製一個新的畫面與文字的「臨時」在其上,另一個按鈕關閉master窗口。 未來,讓一位有編程經驗的朋友來幫助解決這類問題可能會更好。在一些計算論壇上聊聊,我相信你會很快找到一組共享和修復代碼。

+0

如果這個問題已經得到解答,請關閉它 – 2017-08-07 16:00:06

相關問題