Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python tkinker py2app应用程序赢得';关不上_Python_Tkinter_Py2app - Fatal编程技术网

Python tkinker py2app应用程序赢得';关不上

Python tkinker py2app应用程序赢得';关不上,python,tkinter,py2app,Python,Tkinter,Py2app,单击角落中的X时,我的Tkinter应用程序将无法正常关闭。窗口关闭,但仍可以在dock中看到。需要强制退出 我的应用程序比较两个excel工作表并输出一个过滤后的excel工作表 我使用py2app使其可执行 这是我的应用程序: import Tkinter as tk import pandas as pd class SampleApp(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.s

单击角落中的X时,我的Tkinter应用程序将无法正常关闭。窗口关闭,但仍可以在dock中看到。需要强制退出

我的应用程序比较两个excel工作表并输出一个过滤后的excel工作表

我使用py2app使其可执行

这是我的应用程序:

import Tkinter as tk
import pandas as pd


class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.short_path = ""
        self.long_path = ""
        self.output = ""

        self.short_path_label = tk.Label(self, text="Path to short file: ")
        self.short_path_btn = tk.Button(self, text="Browse", command=self.browse_short_path)

        self.long_path_label = tk.Label(self, text="Path to long file: ")
        self.long_path_btn = tk.Button(self, text="Browse", command=self.browse_long_path)

        self.column_label = tk.Label(self, text="Column to filter: ")
        self.column = tk.Entry(self)

        self.outpath_label = tk.Label(self, text="Output directory: ")
        self.out_path_btn = tk.Button(self, text="Browse", command=self.browse_out_path)

        self.file_name_label = tk.Label(self, text="Filename: ")
        self.file_name = tk.Entry(self)

        self.button = tk.Button(self, text="Run", command=self.on_button)

        self.short_path_label.pack()
        self.short_path_btn.pack()
        self.long_path_label.pack()
        self.long_path_btn.pack()
        self.column_label.pack()
        self.column.pack()
        self.outpath_label.pack()
        self.out_path_btn.pack()
        self.file_name_label.pack()
        self.file_name.pack()
        self.button.pack()

    def browse_short_path(self):
        from tkFileDialog import askopenfilename

        tk.Tk().withdraw()
        self.short_path = askopenfilename()

    def browse_long_path(self):
        from tkFileDialog import askopenfilename

        tk.Tk().withdraw()
        self.long_path = askopenfilename()

    def browse_out_path(self):
        from tkFileDialog import askdirectory

        tk.Tk().withdraw()
        self.output = askdirectory()

    def on_button(self):
        short_df = pd.io.excel.read_excel(self.short_path)
        long_df = pd.io.excel.read_excel(self.long_path)

        short_df = short_df[~short_df[str(self.column.get())].isin(long_df[str(self.column.get())].unique())]

        short_df.to_excel(self.output + "/" + self.file_name.get())

app = SampleApp()
app.mainloop()

您可能需要为
WM\u DELETE\u窗口添加处理程序
协议:

app = SampleApp()
app.protocol("WM_DELETE_WINDOW", app.destroy)
app.mainloop()
协议是Tk系统与窗口管理器交互的方式。因此,上面将窗口管理器的close按钮连接到根窗口的destory()方法,该方法将结束Tk mainloop并应退出应用程序

尽管如此,这应该一直是默认行为。可能是py2app的某些特性导致了这里的问题。或者应用程序中的其他内容(可能)需要某种类型的关闭。在这种情况下,您可以为应用程序定义关机功能并执行以下操作:

app.protocol("WM_DELETE_WINDOW", app.shutdown)

当按下窗口管理器的关闭按钮时调用它。

这些
tk.tk()
不是都在创建(然后退出)一个新的根窗口吗?问题何时发生?仅在使用py2app运行时,还是仅在作为python脚本运行时?Pandas/Excel的内容与此有关吗?单击FileDialog中的“X”将关闭FileDialog窗口,而不是主(撤回)窗口。