Как вернуть строковое значение вывода консоли, чтобы поместить его в метку в Tkinter - PullRequest
0 голосов
/ 11 октября 2019

Я создал скрипт на python, в котором есть много операторов печати, показывающих, что делает программа, вместо того, чтобы просто сидеть там, и скрипт на python работает нормально, сейчас я создаю интерфейс с помощью tkinter. То, что я использовал для отправки операторов печати, чтобы вернуть их, выглядит примерно так:

test.py
def PrintX():
    X = [1,2,3,4,5]
    for x in X:
        print(x)

Я планирую добавить фрейм tkinter, в котором я добавлю метку и установлю текстовую переменную для своей функции в моемскрипт. Мой скрипт страницы tkinter выглядит так:

class TradingBotapp(tk.Tk):

    def __init__(self,*args,**kwargs):
        tk.Tk.__init__(self,*args,**kwargs)
        container = tk.Frame(self)
        container.pack(side='top',fill='both',expand= True)
        container.grid_rowconfigure(0,weight = 1)
        container.grid_columnconfigure(0,weight = 1)
        self.frames = {}

        for F in (InitalSetup):
            frame = F(container,self)
            self.frames[F] = frame
            frame.grid(row=0,column=0,sticky='nsew')

        self.show_frame(InitalSetup)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise()

class InitalSetup(tk.Frame):

    def __init__(self,parent,controller):
        tk.Frame.__init__(self,parent)
        label = tk.Label(self, text='Setup', font = LARGE_FONT).pack()
        Frame = tk.Frame(self,width=768,height=576).pack()
        lbl = tk.Message(Frame, text='').pack()
        button1 = ttk.Button(self, text='Start Setup',command=lambda:callback2(lbl)).pack()

def callback2(object):

    old_stdout = sys.stdout
    sys.stdout = StdoutRedirectorLabel(lbl)
    setup()
    #lbl['text'] = sys.stdout.result.strip()
    sys.stdout = old_stdout

class StdoutRedirectorLabel(object):

    def __init__(self,widget):
        self.widget = widget
        self.widget['text'] = ''

    def write(self, text):
        self.widget['text'] += text


app = TradingBotapp()
app.mainloop()

Но ничего не появляется, но когда я нажимаю кнопку, я получаю self.widget['text'] = '' TypeError: 'NoneType' object does not support item assignment, любая помощь будет очень признательна

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Проблема была в том, что lbl был установлен и упакован одновременно. что было не так: lbl = tk.Label(Frame, text='').pack() чтобы исправить это, я должен был сделать это вместо этого:

lbl = tk.Label(Frame, text='') 
lbl.pack()

Но это не работает так, как я хочу, поэтому я должен найти другой способ

0 голосов
/ 11 октября 2019

Ха-ха ... Вы стали жертвой одной из классических ошибок !! (Со всей серьезностью, я делал это много раз раньше, вы не одиноки). Я считаю, что вам нужно упаковывать свои этикетки label1.pack() после их создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...