如何构建 matplotlib、tkinter 后端、与 cx-freeze 一起使用的 GUI?

How to build matplotlib, tkinter backended, GUI that works with cx-freeze?

我正在尝试制作一个 exe。我有一个更复杂的程序,对我来说效果很好,我已经发布了关于 。我试图将此示例简化为最少数量的元素并进行测试。基本上,我需要一个可以创建绘图并使用按钮在该绘图中添加和删除内容的程序。当我 运行 它在我的 python IDE 上时,这工作正常,但是当我创建并冻结 .exe 时,双击它时没有任何反应。我的更复杂的程序也是如此。

这是我尝试制作的代码和 .exe 作为测试(我将此代码保存为 'Test1.py'):

#Filename should be Test1.py for this
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
from matplotlib.widgets import Button


class plotter(object):

    staff, staff_ax=plt.subplots(figsize=(6, 4))
    staff_ax.axhline(y=1, color='0', linestyle='-')
    item_1,=staff_ax.plot(0,0,alpha=0)
    staff_ax.set_ylim(-15,25)
    staff_ax.set_xlim(0,10)

    error_1=0
    pressed=0

    def add_item(self, event):
        if self.pressed==0:
            self.item_1,=self.staff_ax.plot(5,5, marker='o')
            self.staff.show()
            self.pressed=1

    def del_item(self, event):
        try:
            self.item_1
            self.item_1.remove()

        except ValueError:
            self.error_1+=1
        self.staff.show()
        self.pressed=0

callback = plotter()
b1_loc = plt.axes([0.1, 0.05, 0.2, 0.075])
b2_loc = plt.axes([0.3, 0.05, 0.2, 0.075])
b_show = Button(b1_loc, 'Plot')
b_show.on_clicked(callback.add_item)
b_del = Button(b2_loc, 'Remove')
b_del.on_clicked(callback.del_item)

我使用以下作为我的设置文件 (setup.py):

#Filename should be setup.py
from cx_Freeze import setup, Executable
import os
os.environ['TCL_LIBRARY']=r'C:\Users\Bart\Anaconda3\tcl\tcl8.6'
os.environ['TK_LIBRARY']=r'C:\Users\Bart\Anaconda3\tcl\tk8.6'

import sys
base = 'Win32GUI'
if sys.platform == 'win32':
    base = 'Win32GUI'
additional_mods = ['numpy.core._methods', 'numpy.lib.format',
                   "matplotlib.backends.backend_tkagg", 'matplotlib.pyplot', 
                   'matplotlib.image', 'matplotlib.widgets']
setup(
    name = "TEst1",
    version = "1.0.0",
    author = "Bart",
    author_email = "******@gmail.com",
    options = {"build_exe": {'includes': 
        additional_mods,"packages":["pygame","tkinter",'random', 'matplotlib'],}},
    executables = [Executable("Test1.py", base=base)],
    )

当我运行

python setup.py build

它 运行 很好,并创建了一个包含 'Test1.exe' 的文件结构 'build'。但是,当我 运行 Test1.exe 时,什么也没有发生。没有错误,什么都没有。 'Test1.exe' 中的代码是我能想到要测试的最简单的男女同校版本。我已经测试了 cx-freeze 上可用的一些示例,以确保它已安装并 运行 在我的机器上正确安装,确实如此。

有谁知道我怎样才能将它写成 运行 作为 exe 文件?我怀疑我需要将我的情节发送给 TK window。换句话说,将我的代码包装在开头的 root.TK() 和结尾的 root.mainloop() 中,但我不知道如何。

工作时,Test1.py 的输出应该是一个交互图,如下所示:

按钮 'Plot' 添加图像中看到的点,而 'Remove' 删除它。

查看 matplotlib 用户界面示例 embedding_in_tk and embedding_in_tk2 描述如何将绘图发送到 TK window。