Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tkinter按钮创建条目_Python 3.x_Tkinter_Button - Fatal编程技术网

Python 3.x Tkinter按钮创建条目

Python 3.x Tkinter按钮创建条目,python-3.x,tkinter,button,Python 3.x,Tkinter,Button,我正在努力学习tkinter,但遇到了一个小问题。 我创建了一个非常简单的窗口,上面有两条消息:“活动:”、“时间花费:”,窗口底部有一个按钮“+” 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"

我正在努力学习tkinter,但遇到了一个小问题。 我创建了一个非常简单的窗口,上面有两条消息:“活动:”、“时间花费:”,窗口底部有一个按钮“+”

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()
该按钮应在每次单击时创建相邻的两个入口,但如果我单击该按钮,它将创建一次入口,再次单击它将不会在窗口上创建入口,而只是在我的终端中创建此入口:

.!entry .!entry2
.!entry3 .!entry4
.!entry5 .!entry6
.!entry7 .!entry8 
如果我删除“return e1,e2”语句,则所有入口都会在终端和窗口中创建,只需单击一次按钮,而不是每次单击按钮都会创建2乘2

如果我删除“print(e1,e2)”语句,单击该按钮将只创建两个入口一次,并且不会在终端中显示任何内容

创建新入口时,应在入口之间留出一点空间,直到到达按钮的上边框(在本例中为32个入口,16行)


有人能解释一下为什么msg1显示错误(它没有居中,被分成两行),但是msg2没有问题,它们的规格相同吗???

一旦到达
return
语句,代码就会停止,因此循环不会超过第一次迭代

另一方面,如果删除
return
语句,则没有任何地方可以停止循环,因此循环将一直运行,直到它创建了所有小部件为止

我采用了一种使用生成器的方法来解决您的问题,这样您就不用函数
new\u entry()
,而是用一个函数生成条目,另一个函数在调用生成器时放置条目

我还在小部件生成时稍微简化了代码,并更改了拼写错误(用过而不是用过)。我还将tkinter导入*中的
替换为
将tkinter导入为tk
,以避免污染您的命名空间

将tkinter作为tk导入
root=tk.tk()
根几何(“274x520+868+240”)
root.minsize(120,1)
root.maxsize(32841068)
根目录。可调整大小(0,0)
根标题(“学习”)
root.configure(background=“black”)
def入口_生成器():
对于范围内的i(30490,30):
让渡地点(i)
def place_条目(i):
e1=tk.条目(根)
e2=传统条目(根)
e1.位置(y=i,宽度=133)
e2.位置(x=141,y=i,宽度=137)
打印(e1、e2)
ne=输入_生成器()
b1=tk.Button(root,command=lambda:next(ne),text='+',background='darkgrey')
b1.位置(y=499,宽度=276)
msg1=tk.Label(root,text='Activity:',background='darkgrey')
msg1.位置(宽度=133,高度=29)
msg2=tk.Label(root,text='Time-speed:',background='darkgrey')
msg2.位置(x=141,宽度=137,高度=29)
root.mainloop()

另一种方法可能是保留条目的计数,并将计数与
条目的高度相乘

以下是一个例子:

count = 0

def new_entry():
    global count
    e1 = Entry(root)
    e2 = Entry(root)

    count += 1
    y_pos = count*e1.winfo_reqheight()
    e1.place(x=0, y=y_pos*1.5, width=133) # change the multiplication factor to change the padding b/w entry
    e2.place(x=141, y=y_pos*1.5, width=137) # change the multiplication factor to change the padding b/w entry

    print(e1, e2)
还请注意,对于这样的程序,最好使用网格布局

def new_entry():
n=[n表示范围(30490,30)内的n]
对于n中的i:
e1=条目(根)
e2=条目(根)
e1.位置(y=i,宽度=133)
e2.位置(x=141,y=i,宽度=137)
打印(e1、e2)
返回e1,e2```
返回值是问题所在。查看以下示例代码:

def iterate():
对于范围(10)内的i:
印刷品(一)
返回i
val=iterate()
打印(val)
运行此命令时,它将打印:

0
0
0
1
2
...
10
[0, 1, 2, ... 10]
0
1
2
...
10
<generator object iterate at 0x7fb64e584f68> 
[0, 1, 2, 3 ... 10]
因为,
return
使函数立即停止并返回某些内容。 如果您确实必须返回每个值,则可以创建一个列表,将内容附加到该列表中,然后在循环之后返回该列表:

def iterate():
arr=[]
对于范围(10)内的i:
印刷品(一)
附件(i)
返回arr
val=iterate()
打印(val)
将打印:

0
0
0
1
2
...
10
[0, 1, 2, ... 10]
0
1
2
...
10
<generator object iterate at 0x7fb64e584f68> 
[0, 1, 2, 3 ... 10]
或者使用
yield
关键字(它将返回值而不停止循环):

将打印:

0
0
0
1
2
...
10
[0, 1, 2, ... 10]
0
1
2
...
10
<generator object iterate at 0x7fb64e584f68> 
[0, 1, 2, 3 ... 10]
0
1.
2.
...
10
[0, 1, 2, 3 ... 10]
使用
yield
val
将是一个生成器对象,您必须再次迭代以从中获取值。
但是,由于返回值没有在代码中的任何地方使用,您可以删除
返回e1、e2

我感谢您的帮助,我不熟悉您编写它(创建小部件)的方式,但我会尝试解决它。你也有msg1的解决方案吗?即使是您的版本,它仍然存在相同的问题。@如果您可以使用
标签
而不是
消息
,那么它应该可以工作-我刚才更改了解决方案以反映这一点。。很奇怪,但是很有效,谢谢。它说,当在Message()中创建文本时,默认值为“居中”。@Aru我试图使代码更明确一些,这样更容易理解。基本上,函数
entry\u generator
被称为generator对象。生成器对象具有这样的属性:每次调用
next(ne)
,它都将返回循环的下一个元素。因此,当您第一次调用
next(ne)
时,您拥有
i=30
。下次
i=60
等等。@Aru我想这是因为由于窗口的尺寸,
消息
小部件确定没有足够的空间容纳整行,所以它会自动进行行分割。如果您的窗口更大,那么
消息
也可以工作
Label
不会自动进行行拆分,因此您没有这个问题:)是否有一个页面可以解释这些差异,或者帮助我定位这些小部件?我编写小部件的方式,是我学习的唯一方式far@Aru看一看。谢谢,我正要研究“收益率”的问题