为什么grid(row=)在3停止?(tkinter)

0 投票
2 回答
43 浏览
提问于 2025-04-14 15:34

我正在制作一个待办事项列表,我做了一个添加按钮,但它只在第一次点击时有效,之后就停在原地了。

我尝试创建了两个变量,一个用来表示待办事项的行数,另一个用来表示添加按钮。每次添加一个待办事项时,这两个变量都加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来放置EntryCheckbutton会更简单,然后把Button放在Frame外面或者不放在grid里。

你可以用packFrameButton放在一起,之后再用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()

enter image description here


编辑:

顺便说一下:

如果你想访问EntryCheckbutton,你可能需要把它们放在一个列表里,或者在EntryCheckButton中使用StringVarBooleanVarIntVar来获取值。你也需要把它们放在列表中(比如说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()

enter image description here

enter image description here

1

当你使用 tk.Checkbutton().grid(row=var1, column=0) 这个代码时,它会把这个小部件放在由 var1 定义的那一行。它不会(也不能!)记住这个位置是基于一个变量的,也不会在这个变量改变时自动更新位置。这就是它的工作方式。

如果你想在之后改变这个小部件的位置,你必须再次调用 grid,并提供新的行号。

撰写回答