메인 화면의 버튼에서 복귀를 보여주는 Tkinter

Nov 19 2020

처음에는 영어와 코드에 대해 죄송합니다. 저는 초보자입니다. :) 그래서 제가 고집 한 문제는 tkinter 화면에서 버튼을 실행하고 싶다는 것입니다. 지금은 많은 문제로 PyCharm에서 터미널에서 실행해야했습니다. Ping 버튼을 사용하려고 할 때 응답을 제공하지만 GUI 화면에는 표시되지 않습니다. 그것은 모두 PyCharm의 cmd로 이동합니다. 나머지 버튼에도 동일한 문제가 있습니다. 체크 박스는 다른 코드의 일부일뿐입니다. 지금은 무시할 수 있습니다. 어떤 제안이라도 도움이 될 것입니다.


    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()

감사

답변

FlavioMoraes Nov 19 2020 at 21:26

핑을 실행하고 터미널에 결과를 인쇄하고 0을 반환하는 ping_google()메서드 내에서 사용 os.system하고 있습니다. GUI 화면에 인쇄하려면 핑의 출력을 반환하는 함수가 필요합니다. 따라서 subprocess.run대신 사용하십시오.

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