Tkinter - возврат печати импортированных модулей при нажатии кнопки для выполнения функции - PullRequest
0 голосов
/ 27 мая 2018

Я написал некоторый код, предназначенный главным образом для использования с консолью, но мне было предложено создать для него простой графический интерфейс для удобства использования.В нем я устанавливаю основной фрейм с виджетами и использую команду виджетов для вызова функции, которую я импортирую.Однако все импортированные функции и модули записывают в консоль вывода.Есть ли способ вернуть выходную строку / вывод консоли для обновления в графическом интерфейсе при запуске подпроцесса?

Пример сценария:

import Tkinter as *
import myModule1

class MyGUI(Frame):
    def __init__(self):
    # Initialization stuff.
        self.initGUI()

    def initGUI(self):
        self.downloadButton = Button(text="Download data.")
        self.downloadButton["command"] = myModule1.function
        # This function from myModule1 will constantly print to the console as the process is performed - is there any way to have this displayed in the GUI as a ScrollBar? 

    .....

В качестве альтернативы, есть ли способ сделатьдиалоговое окно появляется во время работы процесса?Я спрашиваю, потому что я встроил много операторов print в myModule1 и его подмодули, которые возвращают то, что происходит на консоль.Было бы неплохо отобразить их для пользователей, работающих с графическим интерфейсом, и я преобразовываю его в .exe для удобства использования теми, кто будет его использовать.

Спасибо.

РЕДАКТИРОВАТЬ: Пример того, как myModule1.function может выглядеть:

import otherModule

def function1():

    log = otherModule.function2():
    if log == True:
        print "Function 2 worked."
    elif log == False:
        print "Function 2 did not work."

Тем не менее, function2 в otherModule выводит на консоль, когда он выполняет свои вычисления.Здесь это явно не показано, но вывод консоли будет, по сути, серией вычислений, за которыми последует пример if / elif, показанный выше.

1 Ответ

0 голосов
/ 27 мая 2018

Это не будет чрезвычайно простым, но один из способов сделать это - создать метод или функцию в вашем графическом интерфейсе, которая записывает текстовый виджет или другой виджет, содержимое которого можно легко обновлять.Я назову это outputMethod.Затем передайте эту функцию или метод в myModule1.function(outputMethod).В функции module1.f замените операторы print вызовом outputMethod, предоставив ему соответствующие параметры.Не видя функцию module1.f Трудно представить полный пример, который будет работать.Добавлен следующий пример после того, как OP опубликовал пример кода myModule1.

from Tkinter import *
import myModule1

class MyGUI(Frame):

    def __init__(self, parent):
    # Initialization stuff.
        self.initGUI(parent)

    def initGUI(self, parent):
        Frame.__init__(self, parent)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(1, weight=1)
        self.pack(expand='yes', fill='both')
        self.downloadButton = Button(self, text="Download data.")
        self.downloadButton["command"] = lambda m=self.outputMethod: myModule1.function(m)
        self.text = Text(self)
        self.downloadButton.grid(row=0, column=0)
    self.text.grid(row=1, column=0, sticky='news')
        self.sy = Scrollbar(self, command=self.text.yview)
        self.text['yscrollcommand'] = self.sy.set
        self.sy.grid(row=1, column=1, sticky='nsw')


    def outputMethod(self, the_output):
        self.text.insert('end', the_output + '\n')
        # Scroll to the last line in the text widget.
        self.text.see('end')

if __name__ == '__main__':
    # Makes the module runable from the command line.
    # At the command prompt type python gui_module_name.py
    root = Tk()
    app = MyGUI(root)
    # Cause the GUI to display and enter event loop
    root.mainloop()

Теперь для module1 ...

def function(log):
# Note that log is merely a pointer to 'outputMethod' in the GUI module.

log("Here is a string you should see in the GUI")
log("And this should appear after it.")
# Now demonstrate the autoscrolling set up in outputMethod...
for i in range(50):
    log("Inserted another row at line" + str(i + 2))
...