当前位置: 首页 > 面试题库 >

如何通过按钮命令(TkInter)使用os.startfile

罗俭
2023-03-14
问题内容

尝试在画布上实现按钮,该按钮在.pdf单击时会打开文件。

我的尝试如下

self.B3 = Button(InputFrame,text='Graphical Plots', command = os.startfile('Bessel.pdf'),bd=5,width=13,font="14")
self.B3.grid(column =0,row=3)

不幸的是,我的代码.pdf在我单击按钮之前就打开了该文件,该文件已运行。为什么?


问题答案:

当Python处理这两行时,它会在第一行看到这一点:

os.startfile('Bessel.pdf')

并将其解释为有效的函数调用。因此,它调用了该函数。

要解决此问题,请定义一个函数来处理该行之前的click事件,然后将按钮的commandopion分配给该函数:

def handler():
    # The code in here is "hidden"
    # It will only run when the function is called (the button is clicked)
    os.startfile('Bessel.pdf')
self.B3 = Button(InputFrame, text='Graphical Plots', command=handler, bd=5, width=13, font="14")

或者,在这种情况下,甚至更好/更干净的方法是使用lambda(匿名函数):

self.B3 = Button(InputFrame, text='Graphical Plots', command=lambda: os.startfile('Bessel.pdf'), bd=5, width=13, font="14")

或者,就像@JFSebastian指出的那样,您可以使用functools.partial

self.B3 = Button(InputFrame, text='Graphical Plots', command=functools.partial(os.startfile, "Bessel.pdf"), bd=5, width=13, font="14")

请注意,您必须先导入functools



 类似资料:
  • 问题内容: 我有2个按钮,分别名为“ ButtonA”,“ ButtonB”。如果要单击任何按钮,我希望程序打印“ hello,ButtonA”和“hello,ButtonB”。我的代码如下: 当我单击ButtonA时,会发生错误。 我理解此错误,但是如何将ButtonA的文本传递给lambda? 问题答案: 这应该工作: 有关更多信息,请查看Tkinter回调

  • 问题内容: 我不断收到以下错误:AttributeError:’NoneType’对象没有属性’configure’ 问题答案: 执行时,分配给该命令的结果是命令的结果, 而不是 对创建的对象的引用。 您需要在打包/网格化之前分配变量。它看起来应该像这样:

  • 问题内容: 我正在尝试创建一些按钮(带有for),如下所示: 并且每个按钮都有自己的参数(Test得到Test和Test2得到Test2),但是当我按下按钮时,它们都打印“ Test2”,这意味着它们使用具有相同参数的相同功能。 我该如何解决? 问题答案: 问题是你的lamba在for循环中。你的lambda正在使用该name变量,但是name每次通过for循环都会重新分配该变量。因此,最后,所有

  • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。

  • 问题内容: 我正在尝试制作一个构建检索表单,似乎按钮有问题…我是Python / tkinter GUI编程(和一般的GUI编程)的新手,并借用了Hello World应用程序的框架,并以此为基础。 在下面的代码中,我将“浏览”按钮的“命令”选项设置为在单击类时调用类的内部get_dir()函数。但是,一旦我尝试运行该应用程序,就会调用get_dir()函数,并提示我选择一个目录。有什么想法为什么

  • 我试图在一个for循环中创建按钮。在每个循环中,将i计数值作为命令值中的参数传递出去。因此,当从命令值调用函数时,我可以判断哪个按钮被按下并相应地操作。问题是,假设len是3,它将创建3个按钮,标题为“游戏1”到“游戏3”,但是当按下任何一个按钮时,打印值总是2,最后一次迭代。所以看起来按钮是作为单独的实体制作的,但是命令参数中的i值似乎都是一样的。下面是代码: 有没有办法在每次迭代时获取当前的i