python-3.x - 用于创建条目的 Tkinter 按钮

标签 python-3.x tkinter button

我正在尝试学习 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/

相关文章:

python - 如何在 Docker 上运行的 Apache Superset 中为电子邮件报告配置 Celery Worker 和 Beat?

python - tkinter 鼠标点击计数器不会打破我的倒计时循环

python - 使用 tkinter 生成随机数

android - 单击按钮更改 Activity 时找不到源错误

android - 是否可以在 Python 3 上为 Android 构建 Kivy 应用程序?

python - 如何根据其他列的数量保留行数?

javascript - jQuery 键盘激活一个按钮

java - 当我点击一个按钮时,我只想激活它周围的按钮。这怎么可能?

Python 名称 'os' 未定义,即使它已显式导入

python - 如何选择目录并将其存储到 tkinter 中的变量中?