在Python Tkinter中,我可以按下按钮运行任何exe文件吗



我一直在研究使用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

然后我将Buttons添加到网格中,调用每个按钮self。b在堆栈溢出时,人们真的很困惑。你很快就会看到这些评论。

    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()

使用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()

这就是我为使事情正常工作所做的,我取了f3a3dlegend示例代码(向上滚动(,并开始处理它,因为它运行得很好。让我们讨论一下代码的最上面几行,然后深入了解完整的分解。

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

从Tkinter导入,这个命令告诉pyhton加载GUI驱动程序。从PIL导入图像,ImageTK告诉Python加载Pyhton图像库,这样我们就可以使用彩色照片。根据我的理解,导入操作系统加载驱动程序,这样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

这行代码阻止了你的图像被垃圾收集(这意味着什么(我只知道我添加了它,当我的照片放在def中时应该会出现

下一件事我投入了大量的工作是按钮格式化,你知道宽度大小颜色字体。想出使用自拍框纯属猜测,我只是不断尝试,直到其中一次尝试成功。我在Python Tkinter网格上也有这整件事,所以图像放在第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会服从调用的anser。os.startfile对我来说是一个新术语,但它只是指操作系统启动文件。("confileditor.exe"(表示您需要的文件的字符串名称介于("(之间,将两者放在一起,文件在自己的窗口中运行。这个软件的最后一点我和大家和解了,然后说我可以用它做更多的事情。我开始再次使用f3a3dlegend示例代码。

   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个小时的修改,以使其恰到好处。关于将程序放到网上以便人们下载,我学到了一个非常重要的教训,那就是你需要联系你的主机的Customber支持,并要求链接到TOS服务条款,因为如果你不了解TOS,你可能违反了与出版有关的国际法。非常感谢。

最新更新