Tkinter возвращает результат команды os.system для GUI - PullRequest
0 голосов
/ 22 апреля 2020

Я недавно играл с Tkinter, пытаясь выполнить скрипт python, который работает сам по себе. Я просмотрел несколько других постов на форуме и, похоже, не могу найти решение, с чем я играю.

Следующий скрипт, с которым у меня нет проблем, работает отлично.

import os
os.system('clear')

def check_ping():
    hostname = "8.8.8.8"
    # ping host once
    response = os.system("ping -c 1 " + hostname)
    # check the response...
    if response == 0:
        pingstatus = "\nYou are connected to the Internet. " + hostname + " is reachable"
    else:
        pingstatus = "\nNetwork Error - You are NOT connected to the Internet."

    return pingstatus

pingstatus = check_ping()
print(pingstatus)

В моем окне Tkinter root я разместил метку и две кнопки, я хочу, чтобы метка отображала состояние соединения или результат пинга, отправленного с помощью os .system command.

Проблема, с которой я столкнулся, заключается в том, что при запуске при запуске метка обновляется нормально. При нажатии на кнопку, вызывающую функцию, она НЕ обновляет и не возвращает то, что я ожидаю. Ниже приведен мой код:

import os
from tkinter import *

root = Tk()
root.title('Ping Checker')

def check_ping():
hostname = "8.8.8.8"
response = os.system("ping -c 1 " + hostname)
# check the response...
if response == 0:
    pingstatus = "Internet Connected."
    icon = Label(root, text='Internet status: ' + pingstatus, bd=1)
else:
    pingstatus = "Network Error - NOT connected."
    icon = Label(root, text='Internet status: ' + pingstatus, bd=1)

return pingstatus

pingstatus = check_ping()

icon = Label(root, text='Internet status: ' + pingstatus, bd=1)
button_check = Button(root, text='Check Connection', command=check_ping)
button_quit = Button(root, text='Exit Program', command=root.quit)

icon.pack()
button_check.pack()
button_quit.pack()
root.mainloop()

Я пытаюсь создать интерфейс GUI для проверки соединений с различными серверами, в конце концов я хотел бы иметь это по таймеру, чтобы он мог обновляться автоматически. Кто-нибудь, пожалуйста, укажите мне правильное направление или объясните, почему он работает один раз при запуске, а не при нажатии кнопки.

Спасибо за ваше время.

Йозек

1 Ответ

0 голосов
/ 22 апреля 2020

Проблема в том, что когда вы пытаетесь изменить значение метки, вы просто меняете значение переменной на самом деле, а не упаковываете ее в свое окно.

Простая работа вокруг вас может для этого вместо переопределения вашего значка вы можете использовать метод .config(), который изменяет детали виджета tkinter.

Например,

def check_ping():
hostname = "8.8.8.8"
response = os.system("ping -c 1 " + hostname)
# check the response...
if response == 0:
    pingstatus = "Internet Connected."
    icon.config(text='Internet status: ' + pingstatus)
else:
    pingstatus = "Network Error - NOT connected."
    icon.config(text='Internet status: ' + pingstatus)

return pingstatus

Это должно решить проблему у вас есть.

Best of Luck,

Бен

...