【问题标题】:In Python Tkinter can I press a button to run any exe file?在 Python Tkinter 中,我可以按一个按钮来运行任何 exe 文件吗?
【发布时间】:2013-02-25 01:43:26
【问题描述】:

我一直在研究使用 Tkinter 从一个 Tkinter 软件中打开 exe 文件。我的最终产品是一个 Windows 7 exe 文件,它运行了一个 Tkinter 软件中的所有 exe 文件,然后转换为 exe 文件。

我会从上到下解释我的代码 这是我的各种 Tkinter 模板

from Tkinter import *
from PIL import Image, ImageTk
import os
class App:
def __init__(self, master):
    self.frame = Frame(master)

我添加了一张图片给用户信息如何使用该软件

    img = Image.open("data.gif")
    intro = ImageTk.PhotoImage(img)
    right = Label(None, image=intro)
    right.grid(row=0, column=0, columnspan=4)
    right.image=intro

然后我将按钮添加到网格中,调用每个按钮 self.b 在堆栈溢出时真的让人们感到困惑。您很快就会阅读 cmets。

    self.b = Button(self.frame, bg="red", fg="white", font=("Helvetica", 14), text = ' \n confilextracter \n ', command = self.openFile1)
    self.b.grid(row = 1, column=0)
    self.b = Button(self.frame, bg="red", fg="white", font=("Helvetica", 14), text = ' \n confileditor \n ', command = self.openFile2)
    self.b.grid(row = 1, column=1)
    self.b = Button(self.frame, bg="red", fg="white", font=("Helvetica", 14), text = ' \n confilerehasher \n ', command = self.openFile3)
    self.b.grid(row = 1, column=2)
    self.b = Button(self.frame, bg="red", fg="white", font=("Helvetica", 14), text = ' \n Turn off the Shed \n ', command = self.openFile4)
    self.b.grid(row = 1, column=3)
    self.frame.grid()

接下来我必须让按钮工作来执行,重命名 exe 文件在堆栈溢出时真的让人们感到困惑。对此感到抱歉。

def openFile1(self):
    os.startfile("confilextracter.exe")
def openFile2(self):
    os.startfile("confileditor.exe")
def openFile3(self):
    os.startfile("confilerehasher.exe")

我真的很想纠正最后一个按钮代码,因为我自己找到了答案,因为其他人都在忙着整理这段代码的所有其他部分,你很快就会看到。此时下一个按钮有错误。

def openFile4(self):
    self.b.configure(command = self.b.destroy)

然后我关闭了文件

root = Tk()
app = App(root)
mainloop()

【问题讨论】:

  • 查看subprocess 模块,了解如何从 Python 创建其他进程。
  • 你不能全部命名为 self.b;那将只有一个按钮(最后一个分配)。
  • @F3AR3DLEGEND 我将每个 self.b 放在一个不同的列上,用不同的文本对它的自身进行排序,我还更改了命令以使不同的 def 产生不同的结果

标签: python button tkinter exe


【解决方案1】:

使用os 模块:

from Tkinter import *
import os

class App:
    def __init__(self, master):
        self.frame = Frame(master)
        self.b = Button(self.frame, text = 'Open', command = self.openFile)
        self.b.grid(row = 1)
        self.frame.grid()
    def openFile(self):
        os.startfile(_filepath_)

root = Tk()
app = App(root)
root.mainloop()

【讨论】:

  • 我尝试使用 from Tkinter import * import os class App: def __init__(self, master): self.frame = Frame(master) self.b = Button(self.frame, text = 'Open ', command = self.openFile) self.b.grid(row = 1) self.frame.grid() def openFile(self): os.startfile(Xplorer.exe) root = Tk() app = App(root) root.mainloop()
  • @KenRoberts 您需要提供完整的文件路径,例如“D:\Windows\User\my_file.exe”。此外,它必须是一个字符串。
  • 代码现在可以工作了,因为我把它放到了一个字符串中。 def openFile(self): os.startfile("Xplorer.exe")
  • @KenRoberts:“Xplorer.exe”不是病毒吗?
  • @martineau 我一直在更改文件名以便更好地理解编码,毕竟最终用户并不关心文件的名称。
【解决方案2】:

这就是我为使事情顺利进行所做的, 我使用了 f3ar3dlegend 示例代码(向上滚动)并开始研究它,因为它运行良好。 让我们讨论一下最上面的代码行,然后逐步进行完整的细分。

from Tkinter import *
from PIL import Image, ImageTk
import os

从 Tkinter 导入,这告诉 pyhton 加载 GUI 驱动程序。从 PIL 导入 Image,ImageTK 告诉 Python 加载 Pyhton 图像库,以便我们可以使用彩色照片。根据我的理解,import os 会加载驱动程序,因此 Python 可以从 python 应用程序运行外部程序,调用它们。

我做的第一件事是在 f3ar3dlegend 的代码中添加一张图片,以便为我的用户提供一个包含此代码的信息页面,

    class App:
    def __init__(self, master):

    self.frame = Frame(master)
    img = Image.open("data.gif")
    intro = ImageTk.PhotoImage(img)
    right = Label(None, image=intro)
    right.grid(row=0, column=0, columnspan=4)
    right.image=intro

一行代码让我的图片在 24 小时内无法显示,只是缺少代码

    right.image=intro

这行代码会阻止您的图片被垃圾收集(这意味着什么)

接下来我投入了大量工作是按钮格式化,你知道宽度大小颜色字体。弄清楚使用 self.frame 纯粹是猜测,我只是不断尝试想法,直到我的一次尝试奏效。我在 Python Tkinter Grid 上也有这整件事,所以图像在第 0 行,列跨越 4 或 5 列,以便为更多按钮让路。这些按钮都在第 1 行而不是第 0 行。我发现我可以调用所有按钮 self.b,只要命令是不同的 def 代码没有错误。

    self.b = Button(self.frame, bg="darkred", width=18, fg="white", font=("Arial", 14), text = ' \n confilextracter \n ', command = self.openFile1)
    self.b.grid(row = 1, column=0)
    self.b = Button(self.frame, bg="red", width=17, fg="white", font=("Arial", 14), text = ' \n confileditor \n ', command = self.openFile2)
    self.b.grid(row = 1, column=1)

接下来我做的是def,因为没有这些按钮就无法工作。让库存溢出认为我在上传病毒的原因是我更改了程序名称以使我更好地了解我的程序。

    def openFile1(self):
    os.startfile("confilextracter.exe")
    def openFile2(self):
    os.startfile("confileditor.exe")

它是这样工作的。 openFile1 是一个按钮标注。你按下按钮,它会发出一个标注,匹配的 def 服从调用的分析器。 os.startfile 对我来说是一个新术语,但它只是意味着操作系统启动文件。 ("confileditor.exe") 表示您需要的文件的字符串名称在 (" ") 之间,将两者放在一起,文件在自己的窗口中运行。 这个软件的最后一点我和平相处,然后说我可以用这个做更多。我再次开始使用 f3ar3dlegend 示例代码。

   root = Tk()
   app = App(root)
   mainloop()

这基本上会关闭所有内容,因此 Python 知道是时候显示内容了,而 mainloop 告诉 Tkinter 等待我执行操作。问题是软件有时会在页面上打开一半,而有时会在屏幕上的任何位置打开,所以我添加了这段代码以将软件放在屏幕的左上角。

   app = App(root)
   root.geometry('+0+0')
   mainloop()

我做的最后一件事是在尝试 5 次或 6 次后单击一个按钮即可退出软件。我让 Tkinter 通过按一个按钮来破坏软件窗口。代码是。

   self.b = Button(self.frame, bg="red", width=18, fg="white", font=   ("Arial", 14), text = ' \n Turn off the Shed \n ', command = self.openFile4)
   self.b.grid(row = 1, column=3)
   def openFile4(self):
   root.destroy()

我已经看到无数关于使用 root.destory 错误的人的堆栈溢出的例子,难怪我花了 1 小时修补它以使其恰到好处。 我确实学到了关于将程序放到网上以便人们可以下载的一个非常重要的教训是您需要联系您的主机的客户支持并要求提供 TOS 服务条款的链接,因为如果您不了解 TOS,您可能会违反国际法做出版。谢谢。

【讨论】:

  • Ken,您不应该只在本网站上发布一个可行的解决方案作为答案。答案部分严格用于答案。但是,如果您认为您的工作代码是最佳答案,请编辑您的答案以包含几段关于您所做的事情。否则,与您有相同问题的人可能无法仅从代码中学到任何东西。
  • @BryanOakley 我想提醒您,我被禁止发布“答案部分仅限于答案”。所以我把它贴在这里。如果我不能点击,在我自己的线程中添加一个答案按钮,那么如果人们使用它只会遇到麻烦,那么为什么 Sack Overflow 会首先在那里添加按钮呢?当然,我会按照您的要求做,“包括几段关于您所做的事情”,因为您已允许我这样做。西雅
  • 你不需要我的许可来写一个有用的答案,但你有责任尝试让你的答案有用。该站点用于问题和答案,而不是线程讨论。不要那么防御;只需了解本网站的规则并遵守它们即可。
  • @BryanOakley 我如何在 Threads 之外与您私下交谈?到目前为止,当我去问一个问题时,我一直得到这个答案。抱歉,我们不再接受来自此帐户的问题。请参阅goo.gl/C1Kwu 了解更多信息。损坏是永久性的吗?如果你愿意帮忙,请私下告诉我。以及如何阅读私人信息?西雅
  • 点击该消息中的链接并阅读一切;这将回答您关于被禁止的问题。
猜你喜欢
  • 1970-01-01
  • 2020-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
相关资源
最近更新 更多