gpt4 book ai didi

python - 我收到错误 _tkinter.TclError : bad window path name ".!button" and i'm not sure why

转载 作者:太空宇宙 更新时间:2023-11-04 02:28:17 30 4
gpt4 key购买 nike

我决定尝试使用类来重新创建游戏,这样我就不必使用全局变量,但是当我尝试运行游戏时出现错误。

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 按钮,然后将它应用到 Canvas 上,但它给了我上面的错误。

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

最佳答案

当前的问题是您没有为按钮指定父级。 tl;dr 是您只需要将 Root(或其他一些适当的父窗口)添加到 Gen_PbuttonGen_EButton 的构造函数中,如您为所有其他小部件所做的。


下面两行有一个重要的区别:

Gen_PButton = Button(Root, text = "PLAY", width = 10, font=('Arial', 15), command = self.Play_Game)
Gen_PButton = Button(text = "PLAY", width = 10, font=('Arial', 15), command = self.Play_Game)

两个版本都为按钮小部件创建了一个新名称(在本例中为 .!button),并创建了一个与该名称关联的新 tkinter.Button 对象——但是第一个还要求 Root 创建名为 .!button 的实际小部件,而第二个不要求任何人创建小部件。所以你最终得到了一个附加到一个不存在的小部件的 Button 对象,每当你尝试使用那个 Button 对象时,你都会得到这样的错误:

_tkinter.TclError: bad window path name ".!button"

出现此类错误的通常原因是您破坏了底层按钮小部件,但继续尝试使用 Button。但在这种情况下,您一开始就没有创建小部件,这显然会导致同样的问题。


要准确了解幕后发生的事情,您必须了解 Tkinter 的工作原理——实际的 GUI 小部件和窗口由完全不同的语言 Tcl/Tk 中的代码管理,而 tkinter 是 Python 对象与 Tcl 对象的关联按名称并代理对这些 Tcl 对象的每个方法调用。


您可能想知道为什么 tkinter 首先让您摆脱这种构造,而不是给您一个更容易理解的错误,更早的一行,如下所示:

_tkinter.TclError: trying to create ".!button" with null parent

嗯,从技术上讲,这是完全合法的。您可能稍后通过一些较低级别的方法创建该 Tcl 小部件,或者您可能已经创建了该 Tcl 小部件并且现在只想在它周围包装一个 tkinter Controller 。两者都是非常罕见的情况,但它们并非毫无意义,因此 tkinter 允许它们。

而且,更重要的是:您真的会更容易理解“更好”的错误消息吗?当您第一次学习 tkinter 时,两者都没有意义,并且两者都是您可以学习理解和处理的东西。

关于python - 我收到错误 _tkinter.TclError : bad window path name ".!button" and i'm not sure why,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49825857/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com