Text 尝试将tkinter复选框嵌入顶层的文本框中

Text 尝试将tkinter复选框嵌入顶层的文本框中,text,checkbox,tkinter,embed,python-3.4,Text,Checkbox,Tkinter,Embed,Python 3.4,我正在做一个简单的数据库,跟踪自行车库存。在我的计划中,我遇到了一个困扰了我一整天的障碍。我试图在一个文本框中创建一个复选框列表(利用滚动条),所有这些都在一个顶级弹出窗口中 我无法上传我的全部代码,这太多了,但下面是一段经过简化的代码片段,可以让它正常工作: class Delete_bike: def __init__(self, master): self.master = master top = self.top = tk.Toplevel(s

我正在做一个简单的数据库,跟踪自行车库存。在我的计划中,我遇到了一个困扰了我一整天的障碍。我试图在一个文本框中创建一个复选框列表(利用滚动条),所有这些都在一个顶级弹出窗口中

我无法上传我的全部代码,这太多了,但下面是一段经过简化的代码片段,可以让它正常工作:

class Delete_bike:

    def __init__(self, master):
        self.master = master
        top = self.top = tk.Toplevel(self.master)

        text_frame = tk.Frame(self.top)
        text_frame.grid(row = 0, padx = 10, pady = 10)

        scb = tk.Scrollbar(text_frame)
        scb.grid(row = 0, column = 1, sticky = 'ns')

        d_tb = tk.Text(text_frame, height = 8, width = 40, yscrollcommand = scb.set)
        d_tb.configure(font = ('Times', 10, 'bold'))
        d_tb.grid(row = 0, column = 0)

        scb.config(command = d_tb.yview)

        test_d = {}
        for i in range(10):
            test_d[i] = 0

        for i in test_d:
            test_d[i] = tk.IntVar()
            cb = tk.Checkbutton(text = i, variable = test_d[i])
            d_tb.window_create(tk.END, window = cb)
            d_tb.insert(tk.END, '\n')
真正的版本利用搁置字典中的绘图来填充广泛的自行车列表

当我运行此程序时,会出现以下异常,我完全不理解:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python34\lib\tkinter\__init__.py", line 1538, in __call__
    return self.func(*args)
  File "C:\Users\Gregory\Desktop\Bike Roster v2.0.pyw", line 115, in delete_bike
    x = Delete_bike(self.master)
  File "C:\Users\Gregory\Desktop\Bike Roster v2.0.pyw", line 239, in __init__
    d_tb.window_create(tk.END, window = cb)
  File "C:\Python34\lib\tkinter\__init__.py", line 3296, in window_create
    + self._options(cnf, kw))
_tkinter.TclError: can't embed .52341336 in .52340888.52341000.52341112
接下来,我把这个片段复制到一个独立的程序中,复制到下一个,它工作得非常好。那么,我能不能在顶级联赛中取得我想要的成绩呢?虽然我对这一切都是新手,没有正式的编程培训或指导,但这似乎是我所能看到的唯一区别

import tkinter as tk
from tkinter import ttk
import tkinter.scrolledtext as tkst



class Delete_bike:

    def __init__(self, master):
        self.master = master
#        top = self.top = tk.Toplevel(self.master)

        text_frame = tk.Frame(self.master)
        text_frame.grid(row = 0, padx = 10, pady = 10)

        scb = tk.Scrollbar(text_frame)
        scb.grid(row = 0, column = 1, sticky = 'ns')

        d_tb = tk.Text(text_frame, height = 8, width = 40, yscrollcommand = scb.set)
        d_tb.configure(font = ('Times', 10, 'bold'))
        d_tb.grid(row = 0, column = 0)

        scb.config(command = d_tb.yview)

        test_d = {}
        for i in range(10):
            test_d[i] = 0

        for i in test_d:
            test_d[i] = tk.IntVar()
            cb = tk.Checkbutton(text = i, variable = test_d[i])
            d_tb.window_create(tk.END, window = cb)
            d_tb.insert(tk.END, '\n')


root = tk.Tk()
app = Delete_bike(root)

root.mainloop()
如果我删除hash标记以激活顶层代码行,并将框架放在顶层中,它将生成相同的错误消息。像这样离开,它就工作了

第二个简单的问题是,如果我在这里做错了什么,这可以在顶层实现,那么scrolledtext模块可以代替文本框和滚动条的组合吗


一如既往地谢谢你

您没有为checkbutton指定父项,因此它默认为根窗口。您不能在根目录中有父级的小部件,但请尝试在顶层显示它

使checkbutton成为文本小部件的子级

cb = tk.Checkbutton(d_tb, ...)
是的,您可以使用scrolledtext而不是文本和滚动条,但我不认为这样做有任何好处