python - 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()
谢谢
解决方案
在您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")
推荐阅读
- javascript - 使用lodash在数组列表中按字母排序名称
- android - AsyncTask 可以从后台线程执行吗?
- javascript - 垂直动画javascript
- java - 使用 Spring Boot 服务器进行 Android 登录身份验证
- google-app-engine - Django 与 GAE 上的 Cloud SQL 灵活
- visual-studio - 如何使用 Visual Studio 2010 Express Edition 创建 VBSCRIPT(.vbs) 文件?
- java - 如何选择 datetime mysql 类型为 java.time.LocalDateTime?
- regex - 正则表达式之前不捕获?
- python - ACCESS_REFUSED - 使用身份验证机制 AMQPLAIN 拒绝登录。有关详细信息,请参阅代理日志文件
- javascript - 为什么 let 关键字不适用于 eval()