Tkinter 按钮命令函数的动态变量评估
Evaluation of Dynamic Variable for Tkinter Button command function
我正在制作一个界面,以将可用的 com 端口显示为按钮,并在按下时将 com 名称传递给变量。目前我可以制作动态按钮,但我无法将值传递给外部函数。
代码为 com7 和 com8(我系统上的当前端口)创建了两个按钮,其中包含一个字典,其中 i[1]=com7 和 i[2]=com8。当我按下 i[1] 的按钮时,我得到一个 Keyerror,因为 K 的当前值现在是 3,这不是字典中的键。显然我希望按钮在创建时引用K的值,而不是K的当前值。
本质上,我希望 python 在创建按钮时评估 i[k],而不是在按下按钮时。
import serial, sys, os, Tkinter
from Tkinter import *
def com():
global ser
global p
def pget(inport):
print inport
test.destroy()
test=Tk()
try:
from serial.tools.list_ports import comports
except ImportError:
comports = None
V = ""
while V is "" :
for port, desc, hwid in sorted(comports()):
print "\nAvailable Ports:\n"
V =sys.stderr.write(' %-10s %s\n' % (port, desc))
if V is "":
print "No ports available, plug in COM port and hit ENTER"
raw_input()
def Port():
i={}
k=1
if comports:
l=Label(test, text="Available ports:").pack(side=TOP)
sys.stderr.write('\n Available ports:\n')
for port, desc, hwid in sorted(comports()):
print port
i[k]=port
bport=Button(test,text=port+": "+desc,command=lambda: pget(i[k])).pack()
print k, i[k]
k+=1
test.mainloop()
Port()
com()
改变
bport=Button(test,text=port+": "+desc,command=lambda: pget(i[k])).pack()
收件人:
bport=Button(test,text=port+": "+desc,command=lambda port = i[k]: pget(port))
bport.pack()
这会强制发送到 pget()
的值在创建按钮时设置,而不是在启动 mainloop()
时设置。
我也将 pack()
移动到另一行(这种情况下保存行不是一个好习惯,这种情况很少见)。如果您要尝试返回参考 bport
,它将参考方法 pack()
returns,它始终是 None
。
将方法调用和对象创建分开将防止这种情况发生。
我正在制作一个界面,以将可用的 com 端口显示为按钮,并在按下时将 com 名称传递给变量。目前我可以制作动态按钮,但我无法将值传递给外部函数。
代码为 com7 和 com8(我系统上的当前端口)创建了两个按钮,其中包含一个字典,其中 i[1]=com7 和 i[2]=com8。当我按下 i[1] 的按钮时,我得到一个 Keyerror,因为 K 的当前值现在是 3,这不是字典中的键。显然我希望按钮在创建时引用K的值,而不是K的当前值。
本质上,我希望 python 在创建按钮时评估 i[k],而不是在按下按钮时。
import serial, sys, os, Tkinter
from Tkinter import *
def com():
global ser
global p
def pget(inport):
print inport
test.destroy()
test=Tk()
try:
from serial.tools.list_ports import comports
except ImportError:
comports = None
V = ""
while V is "" :
for port, desc, hwid in sorted(comports()):
print "\nAvailable Ports:\n"
V =sys.stderr.write(' %-10s %s\n' % (port, desc))
if V is "":
print "No ports available, plug in COM port and hit ENTER"
raw_input()
def Port():
i={}
k=1
if comports:
l=Label(test, text="Available ports:").pack(side=TOP)
sys.stderr.write('\n Available ports:\n')
for port, desc, hwid in sorted(comports()):
print port
i[k]=port
bport=Button(test,text=port+": "+desc,command=lambda: pget(i[k])).pack()
print k, i[k]
k+=1
test.mainloop()
Port()
com()
改变
bport=Button(test,text=port+": "+desc,command=lambda: pget(i[k])).pack()
收件人:
bport=Button(test,text=port+": "+desc,command=lambda port = i[k]: pget(port))
bport.pack()
这会强制发送到 pget()
的值在创建按钮时设置,而不是在启动 mainloop()
时设置。
我也将 pack()
移动到另一行(这种情况下保存行不是一个好习惯,这种情况很少见)。如果您要尝试返回参考 bport
,它将参考方法 pack()
returns,它始终是 None
。
将方法调用和对象创建分开将防止这种情况发生。