为什么grid(row=)在3停止?(tkinter)
我正在制作一个待办事项列表,我做了一个添加按钮,但它只在第一次点击时有效,之后就停在原地了。
我尝试创建了两个变量,一个用来表示待办事项的行数,另一个用来表示添加按钮。每次添加一个待办事项时,这两个变量都加1。
我本来期待每次点击添加按钮时,它能往下移动一行,但结果是它只下移了一次,然后就不动了。
import tkinter as tk
root = tk.Tk()
root.geometry("160x270")
var1 = 0
var2 = 1
def add_new_check():
global var1, var2
tk.Entry().grid(row=var1, column=1)
tk.Checkbutton().grid(row=var1, column=0)
var1 += 1
var2 += 1
add_new_check()
tk.Button(root, font=('Arial', 10), text="+", command=add_new_check).grid(row=var2, columnspan = 5)
root.mainloop()
2 个回答
0
当你改变var2
的值时,Button
的位置不会改变。
用Frame
来放置Entry
和Checkbutton
会更简单,然后把Button
放在Frame
外面或者不放在grid
里。
你可以用pack
把Frame
和Button
放在一起,之后再用Entry(frame)
和Checkbutton(frame)
把这些元素放到Frame
里面。
这样你就不需要手动移动Button
,因为它会自动移动(因为它在grid
外面)。
import tkinter as tk
# --- functions ---
def add_new_check():
global var1
tk.Entry(frame).grid(row=var1, column=1)
tk.Checkbutton(frame).grid(row=var1, column=0)
var1 += 1
# --- main ---
var1 = 0
root = tk.Tk()
#root.geometry("160x270")
frame = tk.Frame(root)
frame.pack()
button = tk.Button(root, text="+", command=add_new_check)
button.pack()
add_new_check()
root.mainloop()
编辑:
顺便说一下:
如果你想访问Entry
和Checkbutton
,你可能需要把它们放在一个列表里,或者在Entry
和CheckButton
中使用StringVar
、BooleanVar
、IntVar
来获取值。你也需要把它们放在列表中(比如说items
)。
如果你不打算从grid
中移除项目,那么你可以用var1 = len(items)
来在grid()
中添加新元素。
import tkinter as tk
# --- functions ---
def add_new_check():
#global var1
var1 = len(items)
var_entry = tk.StringVar(root)
tk.Entry(frame, textvariable=var_entry).grid(row=var1, column=1)
var_check = tk.BooleanVar(root)
tk.Checkbutton(frame, variable=var_check).grid(row=var1, column=0)
items.append( (var_entry, var_check) )
#var1 += 1
def save():
"""TODO: save in file."""
for entry, check in items:
print('entry:', entry.get())
print('check:', check.get())
print('---')
# --- main ---
var1 = 0
items = [] # list for pairs [entry. check]
root = tk.Tk()
#root.geometry("160x270")
frame = tk.Frame(root)
frame.pack()
button_add = tk.Button(root, text="+", command=add_new_check)
button_add.pack()
#button_add.pack(fill='both') # resize button
button_save = tk.Button(root, text="SAVE", command=save)
button_save.pack()
#button_save.pack(fill='both') # resize button
add_new_check()
root.mainloop()
1
当你使用 tk.Checkbutton().grid(row=var1, column=0)
这个代码时,它会把这个小部件放在由 var1
定义的那一行。它不会(也不能!)记住这个位置是基于一个变量的,也不会在这个变量改变时自动更新位置。这就是它的工作方式。
如果你想在之后改变这个小部件的位置,你必须再次调用 grid
,并提供新的行号。