Tkinter, показывающий возврат с кнопки на главном экране

#python #button #tkinter #os.system

#python #кнопка #tkinter #os.system

Вопрос:

сначала извините за английский и код, я новичок 🙂 Итак, проблема, с которой я столкнулся, заключается в том, что я хочу выполнять кнопки на экране tkinter. На данный момент с множеством проблем я должен выполнить на терминале из PyCharm. Когда вы попытаетесь использовать кнопку Ping, она выдаст вам ответ, но не на экране графического интерфейса. Все это переходит в cmd на PyCharm. Те же проблемы с остальными кнопками. Флажки — это просто часть другого кода. Пока можно просто игнорировать. Любые предложения будут полезны.

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

Спасибо

Комментарии:

1. На будущее попробуйте писать код на английском языке, трудно пройти через код, который не понимаешь — комментарии, имена переменных и отпечатки. Если возможно, попробуйте перевести его.

2. Хорошо, я сделаю это во всех моих будущих кодах. Нужно думать по-английски 🙂

3. @blazejwiecha помог ли вам мой ответ?

Ответ №1:

Внутри вашего ping_google() метода, который вы используете os.system , который будет запускать ping, печатать результаты на терминале и возвращать 0. Если вы хотите печатать на экране вашего графического интерфейса, вам нужна функция, которая вернет вывод ping. Таким образом, используйте subprocess.run вместо:

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