我在Python中制作了一个简单的“程序启动器”。我有一个制表符分隔文本文件,用,此刻,只是:Python tkinter按钮回调意外行为
记事本 C:\ WINDOWS \ NOTEPAD.EXE
写 C:\ WINDOWS \ WRITE.EXE
程序读取文本文件并创建一个对象数组。每个对象都有一个名称属性(例如记事本)和一个路由属性(例如C:\ windows \ notepad.exe)。然后,对于每个对象,应该在按钮上使用正确的名称制作一个按钮,然后单击按钮应该使用该路线执行正确的程序。
该程序非常接近工作。事实上,对象数组的形成是正确的,因为for循环正确地打印出两个不同的程序名称和两个不同的路线。问题是两个按钮虽然标记正确,但却启动了写入程序!我相信问题出现在回调的某个地方,但是我的Python知识还没有发展到足以解决这个问题!正如你可以从我的代码中看到的,我尝试了一个“内联”回调,并且定义了一个“runprog”函数。他们都给出了相同的结果。
您的帮助,将不胜感激。
import Tkinter as tk
import subprocess
class MyClass:
def __init__(self, thename,theroute):
self.thename=thename
self.theroute=theroute
myprogs = []
myfile = open('progs.txt', 'r')
for line in myfile:
segmentedLine = line.split("\t")
myprogs.append(MyClass(segmentedLine[0],segmentedLine[1]))
myfile.close()
def runprog(progroute):
print(progroute)
subprocess.call([progroute])
root = tk.Tk()
button_list=[]
for prog in myprogs:
print(prog.thename)
print(prog.theroute)
button_list.append(tk.Button(root, text=prog.thename, bg='red', command=lambda: runprog(prog.theroute)))
# button_list.append(tk.Button(root, text=prog.thename, bg='red', command= lambda: subprocess.call(prog.theroute)))
# show buttons
for button in button_list:
button.pack(side='left', padx=10)
root.mainloop()
不太重复,但看到http://stackoverflow.com/questions/1107210/python-lambda-problems/1107333 –