Как собрать matplotlib, tkinter backended, графический интерфейс, который работает с cx-freeze? - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь сделать 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

Он работает нормально и создает структуру файла 'build'который содержит' Test1.exe '.Когда я запускаю Test1.exe, ничего не происходит.Нет ошибок, просто ничего.Код в Test1.exe - это самая простая версия моего кода, которую я могу проверить.Я уже протестировал некоторые образцы, доступные на cx-freeze, чтобы убедиться, что он установлен и работает на моей машине правильно, и это так.

Кто-нибудь знает, как я могу написать это, чтобы он мог работать?как exe?Я подозреваю, что мне нужно отправить свой сюжет в окно TK.Другими словами, оберните мой код в root.TK () в начале и root.mainloop () в конце, но я не знаю как.

При работе вывод Test1.py должен представлять собой интерактивный график, который выглядит следующим образом:

Output

И кнопка 'График »добавляет точку, видимую на изображении, а« Удалить »удаляет ее.

1 Ответ

0 голосов
/ 15 октября 2018

См. Примеры matplotlib пользовательских интерфейсов embedding_in_tk и embedding_in_tk2 , описывающие, как отправить график в окно TK.

...