2017-04-15 49 views
0

對不起,對我來說任何愚蠢或無知,但我是Python新手,並且一般編碼。我一直在試圖獲得一個用於教我自己的遊戲的UI的工作方式。我有一個主窗口和一些按鈕小工具。 Play遊戲按鈕打開第二個窗口(用於遊戲本身)並使用.withdraw方法隱藏根窗口。這工作完美。在遊戲窗口中,我有另一個按鈕,我想銷燬遊戲窗口,並將用戶帶回到已撤消的根菜單窗口。這似乎工作,除了我每次調用它,它會在窗口中創建一個新的,重複的小部件集合,所以我最終得到多個集合。Python:調用一個父類方法來取消一個窗口(Tkinter)會導致窗口中的兩組控件

我會在底部發布我的完整代碼,但這裏是我相信的是相關部分。

tkinter Button在父類(主窗口)內調用它。這工作正常。

def playGame(self):  #Start the main game window 
    self.master.withdraw() 
    gameWindow() 

我使用的子類內的波紋管的方法來破壞遊戲窗口,然後在父類中調用一個方法帶回提前撤回窗口

def exitMenu(self): 
    self.g.destroy() 
    UI(root).showMenu() 

這個工程除了它重複每次造成這種小部件被顯示:

screen capture of result

貝婁是我的所有代碼,非常感謝你的任何 幫幫我。

import tkinter as tk 
import PIL 
from Config import * 

root = tk.Tk() 

class UI(): #Main Menu 

    def __init__(self, master): 

     #Create Main Menu Window 

     self.master = master 
     self.master.title("Monopoly") 
     self.master.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     self.master.geometry((resolution)) 

     #Menu Buttons 

     self.label = tk.Label(master, text= 'Welcome to Monopoly! PLACEHOLDER') 
     self.playButton = tk.Button(master, text= 'Play Game', command= self.playGame) 
     self.settingsButton = tk.Button(master, text= 'settings', command= self.settings) 
     self.exitButton = tk.Button(master, text= 'Exit', command= self.exitGame) 

     self.label.grid(columnspan=2) 
     self.playButton.grid(column=0) 
     self.settingsButton.grid(column=0) 
     self.exitButton.grid(column=0) 

    def settings(self):  #Opens Settings Window 
     s = tk.Toplevel() 
     s.title('Settings') 
     s.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     s.geometry((resolution)) 
     self.master.withdraw() 
     resLabel = tk.Label(s, text= 'Resolution') 
     resOption = tk.OptionMenu(s, resolution, *resList) 

     resLabel.grid(column=0,row=0) 
     resOption.grid(column=0, row=4) 

    def showMenu(self):  #Bring back menu windwow 
     self.master.deiconify() 

    def exitGame(self): #Exit Game Method 
     root.destroy() 

    def playGame(self):  #Start the main game window 
     self.master.withdraw() 
     gameWindow() 

class gameWindow(UI): 

    def __init__(self): 

     self.g = tk.Toplevel() 
     self.g.title('Monopoly') 
     self.g.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     self.g.geometry((resolution)) 

     self.menuButton = tk.Button(self.g, text= 'Main Menu', command= self.exitMenu) 

     self.menuButton.grid(column=0,row=0) 

    def exitMenu(self): 
     self.g.destroy() 
     UI(root).showMenu() 

mainMenu = UI(root) 

root.mainloop() 

回答

0

你應該通過父類,UI,給孩子上課gameWindow,那麼你可以使用父類的方法showMenu()在子類中。

代碼顯示在子窗口的主窗口將是:的 self.mainUI.showMenu()代替UI(root).showMenu()

兒童類變爲:

class gameWindow(UI): 

    def __init__(self, mainUI): # Make the main window a parameter/attribute 

     self.mainUI = mainUI # Make the main window a parameter/attribute 
     self.g = tk.Toplevel() 
     self.g.title('Monopoly') 
     self.g.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     self.g.geometry((resolution)) 

     self.menuButton = tk.Button(self.g, text= 'Main Menu', command= self.exitMenu) 

     self.menuButton.grid(column=0,row=0) 

    def exitMenu(self): 
     self.g.destroy() 
     self.mainUI.showMenu() 

gameWindow現在需要一個參數,所以你通過它的主界面as self

def playGame(self):  #Start the main game window 
     self.master.withdraw() 
     gameWindow(self) 

您可以閱讀更多關於h iding /顯示窗口here

下面是完整的代碼:

import tkinter as tk 
import PIL 
from Config import * 

root = tk.Tk() 

class UI(): #Main Menu 

    def __init__(self, master): 

     #Create Main Menu Window 

     self.master = master 
     self.master.title("Monopoly") 
     self.master.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     self.master.geometry((resolution)) 

     #Menu Buttons 

     self.label = tk.Label(master, text= 'Welcome to Monopoly! PLACEHOLDER') 
     self.playButton = tk.Button(master, text= 'Play Game', command= self.playGame) 
     self.settingsButton = tk.Button(master, text= 'settings', command= self.settings) 
     self.exitButton = tk.Button(master, text= 'Exit', command= self.exitGame) 

     self.label.grid(columnspan=2) 
     self.playButton.grid(column=0) 
     self.settingsButton.grid(column=0) 
     self.exitButton.grid(column=0) 

    def settings(self):  #Opens Settings Window 
     s = tk.Toplevel() 
     s.title('Settings') 
     s.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     s.geometry((resolution)) 
     self.master.withdraw() 
     resLabel = tk.Label(s, text= 'Resolution') 
     resOption = tk.OptionMenu(s, resolution, *resList) 

     resLabel.grid(column=0,row=0) 
     resOption.grid(column=0, row=4) 

    def showMenu(self):  #Bring back menu windwow 
     self.master.deiconify() 

    def exitGame(self): #Exit Game Method 
     root.destroy() 

    def playGame(self):  #Start the main game window 
     self.master.withdraw() 
     gameWindow(self) 

class gameWindow(UI): 

    def __init__(self, mainUI): # Make the main window a parameter/attribute 

     self.mainUI = mainUI # Make the main window a parameter/attribute 
     self.g = tk.Toplevel() 
     self.g.title('Monopoly') 
     self.g.wm_iconbitmap('icons\Monopoly-Icon.ico') 
     self.g.geometry((resolution)) 

     self.menuButton = tk.Button(self.g, text= 'Main Menu', command= self.exitMenu) 

     self.menuButton.grid(column=0,row=0) 

    def exitMenu(self): 
     self.g.destroy() 
     self.mainUI.showMenu() 

mainMenu = UI(root) 

root.mainloop() 
+0

非常感謝你抽出時間來幫助。這阻止了我將筆記本電腦扔出窗外! =)在我原來的代碼中,我認爲我在調用UI類本身,然後是showMenu方法?這是否意味着從另一個類調用一個類方法,它必須始終是我想調用的類的子類? – Shallon

+0

我很高興它幫助:)。 – Khristos

+0

不,你並不總是需要傳遞一個類到另一個類來使用第二個類中的第一個類的方法。這一切都取決於兩個班級之間的相互作用以及他們的工作。在你的情況下,你在gameWindow之外創建了一個'UI'實例。因此'gameWindow'無法訪問'UI'的方法。 – Khristos

相關問題