Tkinter showing return from button on main screen

十年热恋 提交于 2020-12-15 06:27:49

问题


first sorry for English and code, I am beginner :) So , the problem I stuck with is that I wish to execute buttons on the screen of tkinter. For now with lots of problems I got to execute on terminal from PyCharm. When You will try to use Ping button it will give You answer but not on the gui screen. It all goes to cmd on PyCharm. Same issues are on rest of the buttons. Check boxes are just some rest of diferent code. Just could be ignored for now. Any suggestions will be helpful.


    import tkinter as tk
    import random
    import os
    import subprocess
    from subprocess import call, Popen, PIPE
    TYTUL = "Network helper"
    PRZYCISKI = [
    "Ping Google",
    "Lista kart sieciowych",
    "Flush DNS",
    ]
    #
    #   Ustawiam Tkinter
    #
    okno = tk.Tk()
    okno.title(TYTUL)
     
    #
    #   Funkcje
    #
     
    def czysc_ekran():
        # Ta funkcja wyczysci pole tekstowe z calego tekstu
        ekran.delete('1.0', "end")
     
    def aktu_ekran(zawartosc):
        # Ta funkcja wypisuje "zawartosc" w polu tekstowym
        ekran.insert("end", zawartosc + "\n")
     
    def zbierz_zaznaczone():
        # Zbiera te wartosci, które zostaly zaznaczone
        zebrane = []
        for x in dic_przyciski.items():
            if x[1].get() == True:
                zebrane.append(x[0])
        return zebrane
     
    def ping_google():
        # Wypisuje w polu tekstowym ping z Google.com
        #if ping_google():
     
     
     
        czysc_ekran()
        ekran.insert("end", os.system("ping google.com") + "\n")
        #aktu_ekran(os.system("ping google.com"))
        #for x in (os.system("ping google.com")):
     
        aktu_ekran(x)
        #else:
        #    aktu_ekran("Brak zaznaczonych miejsc!")
     
            #print('Wyszedłeś na świat za pomocą hosta Google')
            #os.system("ping google.com")
    
    def lista_kart():
         # Wypisuje w polu tekstowym wszystkie zaznaczone wartosci
        if zebrana_lista():
            czysc_ekran()
            aktu_ekran(os.system("ifconfig"))
            for x in zebrana_lista():
                aktu_ekran(x)
        else:
            aktu_ekran("Brak zaznaczonych miejsc!")
     
     
    def flush_dns():
        # Wypisuje w polu tekstowym wszystkie zaznaczone wartosci
        if flushed_dns():
            czysc_ekran()
            aktu_ekran("Zaznaczone są:")
            for x in flushed_dns():
                aktu_ekran(x)
        else:
            aktu_ekran("Brak zaznaczonych miejsc!")
     
    #
    #   Ustawiam Framy
    #
     
    frame_l   = tk.Frame(okno)
    frame_l.pack(side = "left", fill = "both")
     
    frame_r  = tk.Frame(okno)
    frame_r.pack(side = "right", fill = "both")
     
     
    #
    #   Ustawiam lewy Frame
    #   Lista checkboxów
    # W tym Frame zastosuje .pack() do organizacji
     
    # Slownik dajacy kazdej miejscowce jej wlasne tk.IntVar()
    dic_przyciski = {}
    for x in PRZYCISKI:
        dic_przyciski[x] = tk.IntVar()
    
    # Checkboxy
    for x in dic_przyciski.items():
        tk.Checkbutton(frame_l, text = x[0], variable = x[1], anchor = "w").pack(side = "top",     fill = "both")
     
 
    #
   #   Ustawiam prawy Frame
    #   Pole tekstowe i przyciski
    # W tym Frame zastosuje .grid() do organizacji   
     
    # Pole tekstowe
    ekran = tk.Text(frame_r, height = 25, width = 40)
    ekran.grid(row = 0, column=0, columnspan=5)
     
    # Przyciski
    tk.Button(frame_r, text = PRZYCISKI[0], command = lambda:ping_google()).grid(row = 1, column = 0)
 
    tk.Button(frame_r,text = PRZYCISKI[1],command= lambda:lista_kart()).grid(row = 1 , column = 1)
 
    tk.Button(frame_r,text = PRZYCISKI[2],command= lambda:flush_dns()).grid(row = 1 , column = 2)
    #
    #   Tkinter mainloop
    #
    okno.mainloop()

Thanks


回答1:


Inside your ping_google() method you are using os.system which will run the ping, print results on terminal and return 0. If you want to print in your gui screen, then you need a function that will return the output of the ping. Thus use subprocess.run instead:

proc = subprocess.run('ping google.com', capture_output=True, text=True)
ekran.insert("end", proc.stdout + "\n")


来源:https://stackoverflow.com/questions/64917188/tkinter-showing-return-from-button-on-main-screen

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!