【问题标题】:_tkinter.TclError: bad window path name ".!checkbutton"_tkinter.TclError:错误的窗口路径名“.!checkbutton”
【发布时间】:2020-11-14 11:09:36
【问题描述】:

我正在尝试创建一个从复选框列表中查找某些字段的应用程序。 我在调用search 函数时被困在self.text.window_create("end", window=cb)。虽然在__init__ 中运行该行时它工作正常,但它会在此处引发错误。

import tkinter as tk

class App:

    def search(self):
        searched_field = self.search_box.get()
        found_indexes = []

        for i in range(len(self.name_list)):
            if searched_field in self.name_list[i]:
                found_indexes.append(i)

        self.text.delete("1.0", "end")

        for i in range(len(found_indexes)):
            cb = self.check_buttons[found_indexes[i]]
            self.text.window_create("end", window=cb)
            self.text.insert("end", "\n")

    def write_names(self):

        name_file = "names.txt"

        with open(name_file, "w") as file:

            for name in self.returned_list:
                file.write(name + "\n")

    def __init__(self, root, name_list):

        self.check_buttons = []
        self.var_list = []
        self.returned_list = []

        self.name_list = name_list
        self.start = 0

        self.search_box = tk.Entry(root)
        self.search_box.pack(side="top")
        self.search_button = tk.Button(root, text='Search', command=self.search)
        self.search_button.pack()

        self.scroll_bar = tk.Scrollbar(orient="vertical")
        self.text = tk.Text(root, width=20, height=10, yscrollcommand=self.scroll_bar.set)
        self.scroll_bar.config(command=self.text.yview)
        self.scroll_bar.pack(side="right", anchor="ne", fill="y")
        self.text.pack(side="top", fill="both", expand=True)

        for name in name_list:
            var = tk.BooleanVar()
            cb = tk.Checkbutton(text=name, padx=0, pady=0, bd=0, variable=var)
            self.check_buttons.append(cb)
            self.var_list.append(var)

        for cb in self.check_buttons:
            self.text.window_create("end", window=cb)
            self.text.insert("end", "\n")

        tk.Button(root, text='Write names', command=self.write_names()).pack()
        tk.Button(root, text='Quit', command=root.quit).pack()

name_list = ["aaa", "bbbb", "cccc", "abcd"]
root = tk.Tk()
app = App(root, name_list)
root.mainloop()

错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\RO100162\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 1705, in __call__
    return self.func(*args)
  File "C:/Users/RO100162/Desktop/proiect/eoIUPS/scrollbar.py", line 19, in search
    self.text.window_create("end", window=cb)
  File "C:\Users\RO100162\AppData\Local\Programs\Python\Python37\lib\tkinter\__init__.py", line 3423, in window_create
    + self._options(cnf, kw))
_tkinter.TclError: bad window path name ".!checkbutton"

【问题讨论】:

  • edit您的问题包含错误。

标签: python tkinter


【解决方案1】:

你需要传入 tkinter 根目录

cb = tk.Checkbutton(root, text=name, padx=0, pady=0, bd=0, variable=var)

与您的其他按钮类似

self.search_button = tk.Button(root, text='Search', command=self.search)

【讨论】:

  • 如果不传入,Widgets 默认为 root。
【解决方案2】:

当您删除文本小部件的内容时,检查按钮也会被删除。

这是来自官方 tcl/tk 文档上的文本小部件 [1]

嵌入窗口在屏幕上的位置将随着文本的修改或滚动而更新,并且在它移入和移出文本小部件的可见区域时将被映射和取消映射。每个嵌入窗口在文本窗口小部件中占用一个单位的索引空间,它可以通过其嵌入窗口的名称或它在窗口小部件索引空间中的位置来引用。 如果包含嵌入窗口的文本范围被删除,则窗口被销毁。同样,如果整个文本小部件被删除,则窗口被销毁。

【讨论】:

  • 我想我理解这个问题。你知道解决这个问题的方法吗?我还是想不通。
  • @catza:解决方法是在删除文本小部件的内容后重新创建复选按钮。
猜你喜欢
  • 2021-01-12
  • 2020-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多