【发布时间】:2017-01-24 15:22:32
【问题描述】:
我正在尝试制作一个具有 3x3 复选框网格的 tkinter 程序,我为此创建的代码是:
import tkinter as tk
class App(tk.Frame):
def __init__(self,* args,** qwargs):
tk.Frame.__init__(self)
self.strCategories=("Q","W","E","R","T","Y","U","I","O")
self.varCategories={}
for x in self.strCategories:
self.varCategories[x] = tk.IntVar()
self.chckbxCategories={}
for i in range(3):
for j in range(3):
var = self.varCategories[self.strCategories[i*3+j]]
x=10/40 + 11*i/40
y=7/20 + 4*j/20
print(str(x),str(y))
checkbox = tk.Checkbutton(self, text=self.strCategories[i*3+j], font=('Lucida Grande',15),
anchor='w', bg='#FFFFFF', variable=var, onvalue=1, offvalue=0)
checkbox.place(relx=x, rely=y, relwidth=10/40, relheight=5/20)
self.chckbxCategories[self.strCategories[i*3+j]] = checkbox
app = App()
app.mainloop()
但是,小部件不会出现在屏幕上!如果我用其他几何管理器替换.place 它可以工作(我想使用.place,因为它的relx 和rely 为我处理调整屏幕大小)所以我知道问题不在于制作小部件,但放置它们。
我做错了什么?
外壳输出:
0.25 0.35
0.25 0.55
0.25 0.75
0.525 0.35
0.525 0.55
0.525 0.75
0.8 0.35
0.8 0.55
0.8 0.75
【问题讨论】:
-
也许使用二维列表/元组
self.strCategories = [ ["Q","W","E"] , ["R","T","Y"] , ["U","I","O"] ]然后你就不需要range(3) -
它将更具可读性
cb = tk.Checkbutton()和cb.place()和self.chckbxCategories[...] = cb -
你使用 Python 2 吗?然后
10/40给出0,而不是0.25。最好使用print来检查分配给relx、rely等的值。 -
我认为问题在于
place(relx=10/4 + 11*i/4, ...),relx这里大于一,所以在窗外。 -
不要在一行中放这么多代码。使用临时变量。例如,计算 relx 和依赖值并将值存储在变量中。这样您就可以检查这些值是否符合您的预期(可能不是)。
标签: python python-3.x loops checkbox tkinter