我尝试ping网站并将输出实时显示给Label。问题:该命令产生无限循环(nom_mp4 = tk.Label(root,text = line),代码在nom_mp4.pack()之前停止。 有人有想法让它发挥作用吗? 这是我的代码:
from subprocess import Popen, PIPE, STDOUT
import Tkinter as tk
from Tkinter import *
def commande():
cmd = 'ping www.wikipedia.com'
p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
for line in iter(p.stdout.readline,''):
nom_mp4 = tk.Label(root, text=line)
nom_mp4.pack()
root = Tk()
root.geometry('300x190+400+400')
browsebutton2 = tk.Button(root,text='Ping',command=commande) #le bouton browse
browsebutton2.pack()
root.mainloop()
答案 0 :(得分:0)
一种解决方案是使用线程。
from subprocess import Popen, PIPE, STDOUT
import Tkinter as tk
from Tkinter import Tk
from threading import Thread
def create_worker(target):
return Thread(target=target)
def start_worker(worker):
worker.start()
def commande():
cmd = 'ping www.wikipedia.com'
p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
for line in iter(p.stdout.readline, ''):
nom_mp4 = tk.Label(root, text=line)
nom_mp4.pack()
root = Tk()
root.geometry('300x190+400+400')
worker = create_worker(commande)
tk.Button(root, text='Ping', command=lambda: start_worker(worker)).pack()
root.mainloop()
答案 1 :(得分:0)
cmd = 'ping www.wikipedia.com'
这将无限运行。您需要定义运行的次数。在测试时,也许不会ping网站。例如:
cmd = 'ping -c 10 localhost'
-c 10
告诉ping运行10次。 localhost
只是ping你自己的机器,当你按照预期的方式工作时用URL替换。
您还应该在tk.Label
之外移动for-loop
的创建。您不需要每次都创建新标签,只需更改标签的text
值即可。如果您在tk.Button
之后创建并打包它,它将显示在窗口中的按钮下方。
要更新text
的{{1}},您可以执行以下操作:
tk.Label
nom_mp4.configure(text=new_value_here)
运行时窗口不会更新,并且在循环结束之前它将被“锁定”。要让它更新,您可以将其放在for-loop
:
for-loop
虽然窗口仍然会被锁定。为了解决这个问题,我相信你必须研究root.update_idletasks()
或类似的东西。
答案 2 :(得分:0)
有效!我已根据您的建议更改了代码。我没有在ping命令上放置-c选项,因为我希望ping能够独立工作而不会阻塞程序。我按照Oystein-hr的建议更改了循环外部包的位置,并使用configure更新了文本。我还插入了一个以Josh Leeb-du Toit为例的线程。 多谢你们。
from subprocess import Popen, PIPE, STDOUT
import Tkinter as tk
from Tkinter import Tk
from threading import Thread
def create_worker(target):
return Thread(target=target)
def start_worker(worker):
worker.start()
def commande():
cmd = 'ping localhost'
p = Popen(cmd.split(), stdout=PIPE, stderr=STDOUT)
for line in iter(p.stdout.readline, ''):
result.configure(text=line)
root = Tk()
root.geometry('600x80+400+400')
worker = create_worker(commande)
tk.Button(root, text='Ping', command=lambda: start_worker(worker)).pack()
result = tk.Label(root)
result.pack()
root.mainloop()