尝试将 tkinter 复选框嵌入顶层的文本框中
Trying to embed tkinter checkboxes in a text box, within a toplevel
我正在开发一个跟踪自行车库存的简单数据库。在我的程序深处,我遇到了一个困扰我一整天的障碍。我正在尝试在文本框中创建一个复选框列表(以使用滚动条),所有这些都在顶层弹出窗口中。
我无法上传我的全部代码,它太多了,但这里是经过简化的代码片段,可以使它正常工作:
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
接下来,我将代码片段复制到一个独立的程序中,然后再复制,效果非常好。那我能不能在toplevel达到我想要的结果呢?当然,我是新手,没有接受过正式的编程培训或指导,但这似乎是我能看到的唯一区别。
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()
如果我删除井号标签以激活顶层代码行并将框架放在顶层内,它会生成相同的错误消息。就这样放着就行了。
第二个快速问题,如果我在这里做错了什么,并且这可以在顶层内实现,是否可以使用 scrolledtext 模块代替文本框和滚动条组合?
一如既往的感谢!
您没有指定复选按钮的父级,因此它默认为根 window。您不能在根目录中拥有父级的小部件,但请尝试在顶层显示它。
使复选按钮成为文本小部件的子项。
cb = tk.Checkbutton(d_tb, ...)
是的,您可以使用 scrolledtext 代替文本和滚动条,但我看不出这样做有什么好处。
我正在开发一个跟踪自行车库存的简单数据库。在我的程序深处,我遇到了一个困扰我一整天的障碍。我正在尝试在文本框中创建一个复选框列表(以使用滚动条),所有这些都在顶层弹出窗口中。
我无法上传我的全部代码,它太多了,但这里是经过简化的代码片段,可以使它正常工作:
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
接下来,我将代码片段复制到一个独立的程序中,然后再复制,效果非常好。那我能不能在toplevel达到我想要的结果呢?当然,我是新手,没有接受过正式的编程培训或指导,但这似乎是我能看到的唯一区别。
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()
如果我删除井号标签以激活顶层代码行并将框架放在顶层内,它会生成相同的错误消息。就这样放着就行了。
第二个快速问题,如果我在这里做错了什么,并且这可以在顶层内实现,是否可以使用 scrolledtext 模块代替文本框和滚动条组合?
一如既往的感谢!
您没有指定复选按钮的父级,因此它默认为根 window。您不能在根目录中拥有父级的小部件,但请尝试在顶层显示它。
使复选按钮成为文本小部件的子项。
cb = tk.Checkbutton(d_tb, ...)
是的,您可以使用 scrolledtext 代替文本和滚动条,但我看不出这样做有什么好处。