Tkinter 从主屏幕上的按钮显示 return
Tkinter showing return from button on main screen
首先抱歉英语和代码,我是初学者:)
所以,我遇到的问题是我希望在 tkinter 的屏幕上执行按钮。现在有很多问题,我必须从 PyCharm 在终端上执行。当您尝试使用 Ping 按钮时,它会给您答案,但不会在图形界面上显示。这一切都转到 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()
谢谢
在您的 ping_google()
方法中,您正在使用 os.system
,它将 运行 ping,在终端上打印结果和 return 0。如果您想在您的gui 屏幕,那么您需要一个函数来 return ping 的输出。因此使用 subprocess.run
代替:
proc = subprocess.run('ping google.com', capture_output=True, text=True)
ekran.insert("end", proc.stdout + "\n")
首先抱歉英语和代码,我是初学者:) 所以,我遇到的问题是我希望在 tkinter 的屏幕上执行按钮。现在有很多问题,我必须从 PyCharm 在终端上执行。当您尝试使用 Ping 按钮时,它会给您答案,但不会在图形界面上显示。这一切都转到 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()
谢谢
在您的 ping_google()
方法中,您正在使用 os.system
,它将 运行 ping,在终端上打印结果和 return 0。如果您想在您的gui 屏幕,那么您需要一个函数来 return ping 的输出。因此使用 subprocess.run
代替:
proc = subprocess.run('ping google.com', capture_output=True, text=True)
ekran.insert("end", proc.stdout + "\n")