【问题标题】:How to put tkinter Message widget on tkinter Canvas如何将 tkinter 消息小部件放在 tkinter 画布上
【发布时间】: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.MessageError.TclError: bad window path name

标签: python python-3.x tkinter


【解决方案1】:

过了一会儿我发现这只是一个逻辑错误。在我的真实代码中,我调用了一个函数,该函数将在 homeScreen() 函数的开头删除画布对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-28
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多