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

标签 python exe cx-freeze

我正在尝试制作一个 exe。我有一个更复杂的程序,对我来说效果很好,我已经发布了 here .我试图将此示例简化为最少数量的元素并进行测试。基本上,我需要一个可以创建绘图并使用按钮在该绘图中添加和删除内容的程序。当我在我的 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 窗口。换句话说,将我的代码包装在开头的 root.TK() 和结尾的 root.mainloop() 中,但我不知道如何。

运行时,Test1.py 的输出应该是一个如下所示的交互式图表:

Output

“绘图”按钮添加图像中看到的点,而“删除”按钮删除它。

最佳答案

查看 matplotlib 用户界面示例 embedding_in_tkembedding_in_tk2描述如何将绘图发送到 TK 窗口。

关于python - 如何构建 matplotlib、tkinter 后端、与 cx-freeze 一起使用的 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52808463/

相关文章:

python - 从 Python 脚本重新加载 Apache

c - 非常简单的 C 程序崩溃

Python多处理卡住叉炸弹

python - 什么是“好的python代码”,这如何满足准则?

Python 3.6 - 从文件中读取编码文本并转换为字符串

python - 将qcombobox中所做的选择保存在pyqt中

python - 如何让py2exe内置版权信息

javascript - 如何使用 Electron 中的按钮打开 exe 文件

python - cx_freeze python sqlite3 数据库在 build.exe 后不起作用?

python - 安装后 cx_freeze 无法获取 zip 导入器