【发布时间】:2019-10-13 15:55:48
【问题描述】:
我试图用 tkinter 创建一个窗口。在主屏幕上,我会有一个标签、几个按钮,然后是一条消息,所有这些都在tkinter.Canvas 上。我用不同的功能创建了它们,但即便如此,标签和按钮仍在画布上。消息没有,返回错误:
File "C:\Users\bobby\AppData\Local\Programs\Python\Python35-32\NFL Model\nflScreen.py", line 54, in homeScreen
self.homeText = tk.Message(master=self.canvas, text=self.getText(0), width=550)
File "C:\Users\bobby\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2816, in __init__
Widget.__init__(self, master, 'message', cnf, kw)
File "C:\Users\bobby\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 2139, in __init__
(widgetName, self._w) + extra + self._options(cnf))
_tkinter.TclError: bad window path name ".59508144.59508176"
这是我制作窗口的代码:
import tkinter as tk
class Window(tk.Frame):
def __init__(self, master=None):
tk.Frame.__init__(self, master)
self.pack()
self.makeScroll(); self.showMenu(); self.homeScreen();
def makeScroll(self):
self.canvas = tk.Canvas(self, bg='#F0F0F0', width=1000, height=600)
self.canvas.grid(row=0, column=0) ###Makes the Canvas. This part works well
def showMenu(self):
self.home = tk.Button(self.canvas, text="Home", command=self.homeScreen, width=10)
self.home.grid(column=0, row=1) ###Make some buttons, this part works well.
self.rank = tk.Button(self.canvas, text="Rankings", command=self.rankingScreen, width=10)
self.rank.grid(column=1, row=1)
###I tried adding a Message here to the canvas, and it worked, but I need the message to be made in another function
def homeScreen(self):
###This part doesn't work. I know that self.canvas is still a variable.
self.homeText = tk.Message(master=self.canvas, text=self.getText(0), width=550)
self.homeText.grid(column=0, row=3, columnspan=7)
基本上,我在makeScroll() 中创建tkinter.Canvas。当我在showMenu() 中添加小部件时,它可以工作。但是当我尝试在homeScreen() 中添加小部件时,它没有。有谁知道为什么,以及如何解决?
【问题讨论】:
-
我怀疑在您的实际代码中,您在不适当的时间调用
self.homeScreen()- 也许是在调用.mainloop()之后,此时窗口不再存在以添加小部件.另外,为什么要将所有内容都添加到 Canvas 中,而不是直接添加到 Frame 中?这样做的正常原因是允许滚动内容,但您并没有为此做正确的事情 - 特别是,您必须使用<canvas>.create_window()而不是<widget>.grid()将小部件置于 Canvas 的控制之下. -
我确实想添加滚动条,所以我将所有内容添加到画布中。我在
Window.__init__()中调用了self.homeScreen,初始化后我调用了.mainloop(),所以我认为它应该在.mainloop()之前这样做。 -
我也开始将所有内容都放在一个 Frame 中,然后意识到我需要一个滚动条,所以我将所有内容都更改为 Canvas。在框架中我做了
<widget>.grid(),所以为了保持与我在画布上做<widget>.grid()相同的结构。 -
@B.Johnson: "如何将 tk.Message 放在 tkinter 画布上":要在画布上放置一个 Tkinter 小部件,你有使用Canvas.create_window-method。
-
@B.Johnson:“消息没有,返回错误:”:这是来自
tk.Message的Error:.TclError: bad window path name
标签: python python-3.x tkinter