2017-06-15 1 views
1

Ich habe einige Skripte geschrieben, die eine Handvoll Funktionen enthalten, um einige Webscraping zu tun. Beim Ausführen der Skripte werden die Ergebnisse mit einfachen 'print'-Befehlen in die IDLE-Shell gedruckt.Print to Tkinter GUI, nicht Konsole

Ich habe eine grundlegende tkinter GUI, die das Skript ausführen wird, wenn auf eine Schaltfläche geklickt wird, aber die Ergebnisse weiterhin in die Shell gedruckt werden. Wie kann ich meinen Code so anpassen, dass beim Aufruf von Master.master() alle in diesem Prozess eingebetteten Druckanweisungen in einen Bereich auf meiner grafischen Benutzeroberfläche gedruckt werden. Der Code, den ich habe, ist folgende:

from tkinter import * 
import Master #Importing my scraper function 

win = Tk() 
win.title('Hashtag Scraper') 

SearchButton = Button(win,text = 'Search') 

SearchButton.grid(row=2,column = 1) 

htag_label = Label(win,text = 'What Hashtag?') 
htag_label.grid(row = 1,column = 0) 

email_label = Label(win,text = 'FB Email') 
email_label.grid(row = 1,column = 1) 

password_label = Label(win,text = 'FB Password') 
password_label.grid(row = 1,column = 2) 

def button(): 
    htag = hashtag.get() 
    user = usr.get() 
    password = pwd.get() 
    Master.master(htag,refresh = 3,usr = user,pwd = password) #Function call - want this to print on GUI instead of shell 

#win.bind('<Return>', SearchButton) 

SearchButton.configure(command = button) 


hashtag = StringVar() 
#hashtag.set('Hashtag') 
hashtag_entry = Entry(win,textvariable=hashtag) 
hashtag_entry.grid(row = 0, column = 0) 

usr = StringVar() 
usr.set('[email protected]') 
usr_entry = Entry(win,textvariable=usr) 
usr_entry.grid(row = 0, column = 1) 

pwd = StringVar() 
#pwd.set('FB Password') 
pwd_entry = Entry(win,textvariable=pwd) 
pwd_entry.grid(row = 0, column = 2) 
+1

Sie können die Ausgabe in eine tkinter Textbox einfügen. – Stack

+0

Ich entschuldige mich für meine Python Ignoranz, aber wäre das so einfach wie das Ändern der endgültigen 'print' Anweisung in meiner Hauptfunktion in Rückgabe und Einstellung als das Setzen einer Variablen als das Ergebnis? –

+0

es ist ziemlich einfach, lesen Sie es einfach hier: http://effbot.org/tkinterbook/text.htm – Stack

Antwort

0

Je nachdem, wo auf der GUI und welcher Art von Widget wollen Sie das Ergebnis Ihres master Methodenaufruf anzuzeigen, oder vielleicht in einem neuen TextBox Popup-Fenstern wie in dem genannten Kommentare, es auf die Art der Widget ändern Sie verwenden möchten:

class Master: 
    def __init__(self, htag, refresh, usr, pwd): 
     self.htag = htag 
     self.refresh = refresh 
     self.usr = usr 
     self.pwd = pwd 

    def master(self): 
     return '\n'.join([self.htag, str(self.refresh), self.usr, self.pwd]) 

...

def button(): 
    htag = hashtag.get() 
    user = usr.get() 
    password = pwd.get() 
    m = Master(htag, refresh = 3, usr = user, pwd = password) 
    master_response = m.master() #Function call - want this to print on GUI instead of shell 

    top = Toplevel() 
    top.title("Response from master method") 
    # response_message = "Search Button pushed response" 
    msg = Message(top, text=master_response) 
    msg.pack() 

    button = Button(top, text="Dismiss", command=top.destroy) 
    button.pack() 

Ausgabe:

enter image description here

+0

Vielen Dank! Das ist definitiv nah an dem, was ich suche. Ich möchte nichts anzeigen, bis die Schaltfläche "Suchen" angeklickt wird. Außerdem gibt meine "Master" -Funktion tatsächlich nichts zurück, es gibt nur mehrere Druckanweisungen, die die Ergebnisse anzeigen. Ist das sinnvoll? –

+0

Sure tut :) Ich wollte nur eine Idee, und wenn dies in der 'button()' Methode gesetzt wird, würde Text den Text nur angezeigt, nachdem die Taste gedrückt wurde, und der Text wäre der 'master() 'method text in einer Rückgabevariablen. Also könnten alle 'print' Anweisungen in' Master.master() 'in eine' return' Anweisung am Ende dieser Methode geschrieben werden (vielleicht so etwas wie 'return '.join (text1, text2)'), die bekommen zurück zur 'master_response' -Variablen (hier auskommentiert, aber Sie würden es benutzen) und in Widget-Parameter als' text = master_response' eingeben. – davedwards

+0

Ich werde die Antwort aktualisieren, um zu demonstrieren, wenn das keinen Sinn ergibt. – davedwards