首页 > 解决方案 > Tkinter 在主屏幕上显示从按钮返回

问题描述

首先抱歉英语和代码,我是初学者:) 所以,我坚持的问题是我希望在 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()

谢谢

标签: pythonbuttontkinteros.system

解决方案


在您ping_google()正在使用的方法中os.system,它将运行 ping,在终端上打印结果并返回 0。如果您想在 gui 屏幕上打印,那么您需要一个函数来返回 ping 的输出。因此subprocess.run改用:

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

推荐阅读