如何在不使用 tkinter 打开控制台窗口的情况下运行 Python 脚本?

Posted

技术标签:

【中文标题】如何在不使用 tkinter 打开控制台窗口的情况下运行 Python 脚本?【英文标题】:How to make a Python script run without it opening the console window with tkinter? 【发布时间】:2021-02-04 20:19:35 【问题描述】:

我用 tkinter 启动了一个小应用程序,它允许对画布内的对象进行屏幕截图。我正在使用带有 imagegrab 的 PIL 库。效果很好。但是当我冻结应用程序并单击屏幕截图时,会打开命令提示符。如何防止命令提示符打开?

console image

完整代码: import tkinter as tk # Python 3 tkinter 模块

from PIL import Image, ImageTk 
from PIL import Image, ImageTk, ImageGrab

class App(tk.Frame):
def __init__(self, parent):
    tk.Frame.__init__(self, parent)
    self.parent=parent

    file = 'images.jpg'
    self.img = Image.open(file)
    #self.img.show() #Check to proof image can be read in and displayed correctly.
    self.photo = ImageTk.PhotoImage(self.img)
    print('size of self.img =', self.img.size)
    centerx= self.img.size[0]//2
    centery= self.img.size[1]//2
    print ('center of self.img = ', centerx, centery)

    self.cv = tk.Canvas(self)
    self.cv.create_image(centerx, centery, image=self.photo)
    self.cv.grid(row=0, column=0, columnspan=3, sticky='nsew') 

    self.snappic=tk.Button(self, text='SNAP', command=self._snapCanvas)
    self.snappic.grid(row=1, column=0, sticky='nsew')



def _snapCanvas(self):
    print('\n def _snapCanvas(self):')
    canvas = self._canvas() # Get Window Coordinates of Canvas
    self.grabcanvas = ImageGrab.grab(bbox=canvas)
    self.grabcanvas.show()



def _canvas(self):
    print('  def _canvas(self):')
    print('self.cv.winfo_rootx() = ', self.cv.winfo_rootx())
    print('self.cv.winfo_rooty() = ', self.cv.winfo_rooty())
    print('self.cv.winfo_x() =', self.cv.winfo_x())
    print('self.cv.winfo_y() =', self.cv.winfo_y())
    print('self.cv.winfo_width() =', self.cv.winfo_width())
    print('self.cv.winfo_height() =', self.cv.winfo_height())
    x=self.cv.winfo_rootx()+self.cv.winfo_x()
    y=self.cv.winfo_rooty()+self.cv.winfo_y()
    x1=x+self.cv.winfo_width()
    y1=y+self.cv.winfo_height()
    box=(x,y,x1,y1)
    print('box = ', box)
    return box


if __name__ == '__main__':
    root = tk.Tk()
    root.title('App'), root.geometry('300x300')
    app = App(root)
    app.grid(row=0, column=0, sticky='nsew')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)

app.rowconfigure(0, weight=10)
app.rowconfigure(1, weight=1)
app.columnconfigure(0, weight=1)
app.columnconfigure(1, weight=1)
app.columnconfigure(2, weight=1)

app.mainloop()

【问题讨论】:

如果您使用PyInstaller冻结应用程序,则在运行pyinstaller 时添加-w 选项:pyinstaller -F -w ... 【参考方案1】:

将文件的扩展名从 .py 更改为 .pyw

与py的唯一区别是在Windows下双击pyw扩展的源码会调用pythonw.exe来执行源码。此实现将没有命令行窗口。主要用于GUI程序发布时不需要查看控制台信息。

【讨论】:

【参考方案2】:

我意识到能够做到这一点的主要方法是使 .py 或 .pyw 文件成为 exe。另一种方法是为您的代码创建一个 Python Web 服务器。

【讨论】:

如果您的应用程序已经是一个 exe,那么要创建一个 python 网络服务器,只需在线查找一个 youtube 视频,而不是我认为网络服务器是可行的方法

以上是关于如何在不使用 tkinter 打开控制台窗口的情况下运行 Python 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何在程序启动后在不打开控制台的情况下从批处理文件运行程序?

如何在不打开新命令行窗口的情况下使用“schtasks”执行计划任务?

HTML 如何在不使用函数的情况下从链接打开弹出窗口

如何在不使用函数的情况下从链接打开弹出窗口

如何在没有按钮的情况下关闭tkinter窗口而不完全关闭Python?

如何同时打开 Pygame 窗口和 Tkinter 窗口?