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

时间:2018-10-15 00:59:05

标签: 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”中的代码是我认为可以测试的最简单的coed版本。我已经测试了cx-freeze上的一些示例,以确保它已在我的计算机上正确安装并运行。

有人知道我怎么能写这个,使其可以作为exe运行吗?我的怀疑是我需要将情节发送到TK窗口。换句话说,将我的代码首先放在root.TK()中,然后将root.mainloop()结尾,但是我不知道如何。

工作时,Test1.py的输出应为交互式绘图,如下所示:

Output

“绘图”按钮添加图像中可见的点,而“移除”按钮则删除图像。

1 个答案:

答案 0 :(得分:1)

请参见matplotlib用户界面示例embedding_in_tkembedding_in_tk2,其中描述了如何将图发送到TK窗口。