【问题标题】:running button commands on startup [duplicate]启动时运行按钮命令[重复]
【发布时间】:2016-04-06 01:41:18
【问题描述】:

我目前正在开发一个程序来扫描文件夹,找到所有 .exe 文件并将它们放在一个可以运行的列表中。

到目前为止,我已经设法获取列表、创建按钮,但还没有运行程序本身。相反,它在打开运行 python 代码时运行程序。

import os
import Tkinter

top = Tkinter.Tk()

def run(exe):
    os.system(exe)

exes = []
for root, dirs, files in os.walk(r'./'):
    for file in files:
        if file.endswith('.exe'):
            exes.append(file)

def dispgames(exes):
    exes = exes[:-4]
    return exes

def runit(game):
    os.system(game)

#print(exes)
#print(dispgames(exes))


def radioCreate(typeArray):
    for t in typeArray:
        b = Tkinter.Button(top, text = dispgames(t), command=runit(t))
        b.pack()

radioCreate(exes)

Tkinter.Button(top, text = "Display").pack()

top.mainloop()

任何帮助将不胜感激。

【问题讨论】:

  • 请格式化所有代码,而不是第一行。
  • 对不起,我不知道如何使用这里的代码 sn-p 功能,有点困惑。我现在已经整理好了。 :)

标签: python button tkinter command startup


【解决方案1】:

command 需要函数名 - 这意味着没有 () 和参数。

您可以使用lambda 来执行此操作

command=lambda:runit(t)

但是你在for 循环中创建它,所以t 可能有问题。

lambda 使用对 t 的引用,而不是从 t 复制的值 - 所以在循环中创建的所有 lambda 都将使用相同的值 - 分配给 t 的最后一个值。

但是您可以将值从t 复制到lambda 中的其他变量

command=lambda x=t:runit(x)

-

command=runit(t) 表示“运行函数runit(t) 并将结果分配给command”。有时它会很有用。

-

顺便说一句:在 Tkinter bind()after() 中也需要函数名。

【讨论】:

  • 谢谢。这有点帮助。我已经用文件夹“test1.exe”和“test2.exe”中的2个程序尝试了这个。当我单击 test1.exe 的按钮时,它正在运行 test2.exe,但 test2.exe 的按钮可以正常工作。
  • 如果你在for循环中使用lambda:runit(t),那么所有的lambda都使用相同的值——因为它们使用对内存中相同位置的引用,该位置最后一个值分配给ttest2.exe )。如果您使用lambda x=t:runit(x),那么x=t 将从t 复制值,并且每个lambda 在x 中都有不同的值。
猜你喜欢
  • 2014-01-10
  • 2015-03-24
  • 1970-01-01
  • 2017-12-23
  • 1970-01-01
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
相关资源
最近更新 更多