我正在尝试学习 tkinter,但遇到了一个小问题。 我创建了一个非常简单的窗口,顶部有 2 条消息“Activity:”、“Time Spend:”,窗口底部有一个按钮“+”。
from tkinter import *
root = Tk()
root.geometry("274x520+868+240")
root.minsize(120, 1)
root.maxsize(3284, 1068)
root.resizable(0, 0)
root.title("Learning")
root.configure(background="black")
def new_entry():
n = [n for n in range(30, 490, 30)]
for i in n:
e1 = Entry(root)
e2 = Entry(root)
e1.place(y=i, width=133)
e2.place(x=141, y=i, width=137)
print(e1, e2)
return e1, e2
b1 = Button(root)
b1.place(y=499, width=276)
b1.configure(text="+")
b1.configure(command=new_entry)
b1.configure(background="darkgrey")
msg1 = Message(root)
msg1.place(width=133, height=29)
msg1.configure(text="Activity:")
msg1.configure(background="darkgrey")
msg2 = Message(root)
msg2.place(x=141, width=137, height=29)
msg2.configure(text="Time Spend:")
msg2.configure(background="darkgrey")
root.mainloop()
按钮应该在每次单击时创建 2 个彼此相邻的条目,但如果我单击按钮,它将创建一次条目,再次单击它不会在窗口上创建条目,而只是创建这在我的终端:
.!entry .!entry2
.!entry3 .!entry4
.!entry5 .!entry6
.!entry7 .!entry8
如果我删除 "return e1,e2" 语句,所有条目都会在终端和窗口中创建,只需单击 1 次按钮,而不是 2 2 次创建每次点击按钮。
如果我删除 "print(e1,e2)" 语句,单击该按钮将仅创建一次这 2 个条目,并且不会在终端中显示任何内容。
创建的新条目之间应该有一点空间,直到到达按钮的上边界(在本例中为 32 个条目,16 行)。
谁能解释一下为什么 msg1 显示错误(它没有居中并且分成两行),但是 msg2 没问题,它们具有相同的规范??
最佳答案
一旦到达 return
语句,您的代码就会停止,因此您的循环永远不会超过第一次迭代。
另一方面,如果您删除 return
语句,则没有任何地方可以停止您的循环,因此它会一直运行,直到它创建了所有的小部件。
我采用了一种使用生成器来解决您的问题的方法,这样您就没有函数 new_entry()
,而是有一个函数生成条目,另一个函数在生成器被调用。
我还在小部件生成时稍微简化了您的代码,并更改了一个拼写错误(spent 而不是 spend)。我还将 from tkinter import *
替换为 import tkinter as tk
,以免污染您的命名空间。
import tkinter as tk
root = tk.Tk()
root.geometry("274x520+868+240")
root.minsize(120, 1)
root.maxsize(3284, 1068)
root.resizable(0, 0)
root.title("Learning")
root.configure(background="black")
def entry_generator():
for i in range(30, 490, 30):
yield place_entry(i)
def place_entry(i):
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.place(y=i, width=133)
e2.place(x=141, y=i, width=137)
print(e1, e2)
ne = entry_generator()
b1 = tk.Button(root, command=lambda: next(ne), text='+', background='darkgrey')
b1.place(y=499, width=276)
msg1 = tk.Label(root, text='Activity:', background='darkgrey')
msg1.place(width=133, height=29)
msg2 = tk.Label(root, text='Time Spent:', background='darkgrey')
msg2.place(x=141, width=137, height=29)
root.mainloop()
关于python-3.x - 用于创建条目的 Tkinter 按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65773999/