Tkinter Button命令功能的动态变量评估

时间:2015-01-21 21:29:59

标签: python variables tkinter

我正在创建一个界面来显示可用的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()

1 个答案:

答案 0 :(得分:3)

更改

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(),以便在创建Button时设置,而不是在mainloop()启动时设置。

我还将pack()移到了另一条线上(这是一种罕见的保存线不是一种好习惯的情况)。如果您尝试返回bport,则会引用pack()返回的方法,该方法始终为None

分离方法调用和对象创建将阻止这种情况。