Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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 Tkinter按钮命令功能的动态变量评估_Python_Variables_Tkinter - Fatal编程技术网

Python Tkinter按钮命令功能的动态变量评估

Python Tkinter按钮命令功能的动态变量评估,python,variables,tkinter,Python,Variables,Tkinter,我正在制作一个界面,将可用的com端口显示为按钮,并在按下时将com名称传递给变量。目前,我可以制作动态按钮,但我无法将值传递给外部函数 代码为com7和com8(系统上的当前端口)创建了两个按钮,其中一个字典i[1]=com7,一个字典i[2]=com8。当我按下I[1]的按钮时,我得到一个keyrerror,因为K的当前值现在是3,这不是字典中的键。显然,我希望按钮在创建时引用K的值,而不是K的当前值 本质上,我希望python在创建按钮时计算I[k],而不是在按下按钮时 import se

我正在制作一个界面,将可用的com端口显示为按钮,并在按下时将com名称传递给变量。目前,我可以制作动态按钮,但我无法将值传递给外部函数

代码为com7和com8(系统上的当前端口)创建了两个按钮,其中一个字典i[1]=com7,一个字典i[2]=com8。当我按下I[1]的按钮时,我得到一个keyrerror,因为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()
致:

这将强制在创建按钮时设置发送到
pget()
的值,而不是在启动
mainloop()
时设置

我还将
pack()
移到了另一行(这是一种罕见的保存行不是好做法的情况)。如果您试图返回到
bport
,它将引用方法
pack()
返回的内容,该内容始终为
None


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

谢谢,您刚刚给了我一个关于在tkinter中使用lambda的顿悟!不客气,顺便说一下。。。创建Tkinter对象并在同一表达式上使用
pack()
通常不是一个好主意。这意味着
bport
引用的是
pack()
方法,而不是按钮对象本身。小的修正:当使用
pack()
(或
grid
place
在创建按钮的同一行上时,变量将不会引用
pack()
方法,但是它将包含
pack()
返回的任何内容,它总是
None
bport=Button(test,text=port+": "+desc,command=lambda port = i[k]: pget(port))
bport.pack()