wxPython: создать систему журналов - PullRequest
0 голосов
/ 27 мая 2019

У меня есть приложение, которое вызывает другой скрипт при нажатии на кнопку.В этом сценарии у меня есть несколько отпечатков, которые я хотел бы отобразить в виджете wx.TextCtrl в приложении, но я не знаю, с чего начать.

Это пример сценария с именем:

#export.py

def exportData():
    #some code
    #Some prints that I would like to display on the application

А вот как я вызываю скрипт из приложения:

def loadData(self, event):
    from export import exportData
    exportData()

У меня есть несколько вопросов:

  1. Я предполагаю, что печать не будет работать какжурнал, и я должен использовать какую-то систему журналирования.Это верно?Я пытался использовать log.write, но получаю сообщение «ошибка журнала не определена».
  2. Возможно, вызов exportData () напрямую из def loadData - не лучший способ продолжить.Если это так, каков правильный путь?
  3. Наконец, как я могу отобразить распечатки / логи в виджете wx.TextCtrl приложения?

Не стесняйтесьесли вам нужно больше информации.Заранее благодарю за помощь.

РЕДАКТИРОВАТЬ

Вот минималистичный рабочий пример кода того, что я пытаюсь сделать.Печать «Это мой журнал» в main.py TextCtrl.

# main.py
import wx, sys
import export

class Test(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, "Frame aka Window", size=(300, 200))
        panel = wx.Panel(self)
        log = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY)

        button = wx.Button(panel, label="Export", pos=(80, 80), size=(120, 30))

        self.Bind(wx.EVT_BUTTON, self.export, button)

        mySizer = wx.BoxSizer(wx.VERTICAL)
        mySizer.Add(button, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        mySizer.Add(log, 0, wx.ALL | wx.ALIGN_CENTER, 5)

        panel.SetSizer(mySizer)


    def export(self, event):
        from export import exportData
        exportData()


if __name__ == '__main__':
    app = wx.App()
    frame = Test(parent=None, id=1)
    frame.Show()
    app.MainLoop()

и в файле экспорта:

#export.py

def exportData():
    print("This is my log")

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Во-первых, поздравляю с разработкой следующего утверждения import export, оно заставляет меня улыбаться каждый раз, когда я его вижу.
Вы пытаетесь что-то подобное?

enter image description here

Вот ваш исправленный код для этого:

# main.py
import wx, sys
from export import exportData

class Test(wx.Frame):
    def __init__(self, parent, id):
        wx.Frame.__init__(self, parent, id, "Frame aka Window", size=(300, 200))
        panel = wx.Panel(self)
        self.log = wx.TextCtrl(panel, style=wx.TE_MULTILINE|wx.TE_READONLY, size=(180,100))
        button = wx.Button(panel, label="Export")
        self.Bind(wx.EVT_BUTTON, self.export, button)
        mySizer = wx.BoxSizer(wx.VERTICAL)
        mySizer.Add(button, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        mySizer.Add(self.log, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        panel.SetSizer(mySizer)

    def export(self, event):
        exportData(parent=self)

if __name__ == '__main__':
    app = wx.App()
    frame = Test(parent=None, id=1)
    frame.Show()
    app.MainLoop()

и export.py

import time
import wx

def exportData(parent=None):
    if not parent:
        return
    log = []
    print("This is my log")
    parent.log.write("This is my log\n")
    #solely for the purpose of illustrating updates in real time use sleep between updates
    # and yield to the gui main loop
    # in real time operation remove the sleep commands
    wx.Yield()
    time.sleep(1)
    print("Log line 2")
    parent.log.write("Log line 2\n")
    wx.Yield()
    time.sleep(1)
    print("Log line 3")
    parent.log.write("Log line 3\n")
    wx.Yield()
    time.sleep(1)
    print("Export data has concluded")

Все, что здесь происходит, - это то, что мы передаем parent функции, которая позволяет обновлениям происходить в режиме реального времени. Вызов Yield на мгновение передает управление обратно wx.App.MainLoop для обновления, которое должно быть замечено, в противном случае, хотя обновление произошло, результат не виден, пока MainLoop не вернет управление.

1 голос
/ 27 мая 2019

Вы можете создать «Журнал» как TextCtrl.

self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)

Если вы хотите добавить что-то, вы можете написать это так:

self.log.AppendText('Your String here')

Чтобы очистить его, вы делаете это так:

self.log.Clear()

Чтобы быть более подробным, нам нужно увидеть больше вашего кода. Но, может быть, это тебе уже поможет.

Также я бы импортировал поверх вашего модуля не внутри функции.

from export import exportData

def loadData(self, event):        
        exportData(yourLogData)

Я не знаю, откуда берется информация для вашего журнала, но я бы предположил, что вам нужно передать ее в exportData следующим образом:

[...]
self.log = wx.TextCtrl(Panel, style=wx.TE_MULTILINE|wx.TE_READONLY)
[...]
def exportData(self, yourLogData):
    #some code
    #Some prints that I would like to display on the application
    self.log.AppendText(yourLogData)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...