Python:调用父类方法来解散窗口(Tkinter)会导致窗口中出现两组小部件



很抱歉我有任何愚蠢或无知,但我是Python的新手,而且一般都是编码。我一直在尝试让一个UI为我将要制作的游戏工作,作为自学python的一种方式,我有一个主窗口和一些按钮小部件。 "玩游戏"按钮打开第二个窗口(针对游戏本身),并使用 .withdrawal 方法隐藏根窗口。这非常有效。在游戏窗口中,我有另一个按钮,我想破坏游戏窗口并将用户带回我撤回的根菜单窗口。这似乎有效,除了每次我调用它时,它会在窗口中创建一组新的、重复的小部件,所以我最终得到了多组。

我将在底部发布我的完整代码,但这是我认为的相关部分。

tkinter 按钮在父类(主窗口)中调用它。这工作正常。

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

我在子类中使用 bellow 方法来销毁游戏窗口,然后在父类中调用一个方法来恢复之前撤回的窗口

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

这有效,除了它每次复制小部件导致显示:

结果的屏幕截图

波纹管是我的所有代码,非常感谢您的帮助。

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

你应该将父类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('iconsMonopoly-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现在需要一个参数,因此您可以将其作为self传递主 UI

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

您可以在此处阅读有关隐藏/显示窗口的更多信息

以下是完整的代码:

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

最新更新