【发布时间】:2018-09-24 08:04:39
【问题描述】:
我决定尝试使用类来重新创建游戏,这样我就不必使用全局变量,但是当我尝试运行游戏时出现错误。
Traceback (most recent call last): File "D:\Users\James\Desktop\botmod OOP\index.py", line 203, in <module> Game.New_Game(Root) File "D:\Users\James\Desktop\botmod OOP\index.py", line 18, in New_Game Play_Button = self.Start_Canvas.create_window(300, 325, window = Play_Button) File "C:\Users\James\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py">, line 2501, in create_window return self._create('window', args, kw) File "C:\Users\James\AppData\Local\Programs\Python\Python36\lib\tkinter\__init__.py">, line 2474, in _create *(args + self._options(cnf, kw))))
_tkinter.TclError: bad window path name ".!button"
我已尽我所能仔细研究过这个问题,并且无法单独锻炼错误是什么。以下是我的代码,如果需要,我可以提供所有代码,只需发表评论。它应该创建一个 Tkinter 按钮,然后将其应用到画布上,但它给了我上面的错误。
def New_Game(self, Root):
self.Start_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#ffffff')
self.Start_Canvas.pack()
Title = self.Start_Canvas.create_text(300, 163, text = "BOTMOD", font = ('Cinema Gothic BTN Shadow', 75, 'normal'))
Gen_PButton = Button(text = "PLAY", width = 10, font=('Arial', 15), command = self.Play_Game)
Play_Button = self.Start_Canvas.create_window(300, 325, window = Gen_PButton)
Gen_EButton = Button(text = "EXIT", width = 10, font=('Arial', 15), command = lambda: self.Game_End("EXIT"))
Exit_Button = self.Start_Canvas.create_window(300, 375, window = Gen_EButton)
在我使用 oop 之前,它使用全局变量和函数工作,所以在定义按钮时我找不到导致问题的原因。
示例代码如下
from tkinter import *
from random import choice, shuffle
class Game:
def __init__(self):
self.Playing_Game = True
self.Game_Paused = False
self.Restart_Game = False
self.Already_Played = False
def New_Game(self, Root):
self.Start_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#ffffff')
self.Start_Canvas.pack()
Title = self.Start_Canvas.create_text(300, 163, text = "BOTMOD", font = ('Cinema Gothic BTN Shadow', 75, 'normal'))
Gen_PButton = Button(text = "PLAY", width = 10, font=('Arial', 15), command = self.Play_Game)
Play_Button = self.Start_Canvas.create_window(300, 325, window = Gen_PButton)
Gen_EButton = Button(text = "EXIT", width = 10, font=('Arial', 15), command = lambda: self.Game_End("EXIT"))
Exit_Button = self.Start_Canvas.create_window(300, 375, window = Gen_EButton)
def Play_Game(self):
if self.Already_Played == False:
self.Start_Canvas.destroy()
self.Menu_Canvas = Canvas(Root, width = 600, height = 500, bd=0, highlightthickness=0, bg = '#C0C0C0')
self.Menu_Canvas.pack()
def Game_End(self):
if self.End_Option == "EXIT":
self.Playing_Game = False
Root.destroy()
else:
self.Game_Finished = True
self.Game_Canvas.create_rectangle(120, 120, 480, 300, fill = "#ffffff")
self.Game_Canvas.create_text(300, 210, text = End_Option, font = ('Abadi', 35, "bold"))
#Continue_Button = Button(Root, text = 'Continue', command = self.Game_Restart)
Exit_Button = Button(Root, text = 'Exit', command = lambda: self.Game_End('EXIT'))
#Continue_Button.pack()
Exit_Button.pack()
Root = Tk()
Game = Game()
while True:
while Game.Restart_Game == False:
if Game.Playing_Game == False:
break
else:
Game_Finished = False
Root = Tk()
if Game.Already_Played == True:
Game.Play_Game()
Root.mainloop()
elif Game.Already_Played == False:
Game.New_Game(Root)
Root.mainloop()
break
【问题讨论】:
-
用同名调用多个变量是不好的编程习惯。
-
并不是要删除您的评论@eyllanesc,但在我切换到 oop 之前,我忘了提到这在过去的代码中有效。
-
以前有效不代表现在有效
-
如果您需要帮助,请投入您的时间并提供minimal reproducible example
-
此错误通常发生在您的 tkinter 小部件对象被破坏而图形仍然存在时。可能是将这些
Gen_PButton等存储为self上的属性而不是本地属性,或者使用此类实例的某些代码在mainloop()结束之前不保留对它的引用,或者......别的。如果没有看到完整的示例,很难猜到,但如果你给我们一个,应该很容易调试。