如何停止Pulse()函数(Python2.7、wxPython、EnhancedStatusBar)?
我正在尝试为wxpythongui实现一个进度条。我使用了增强状态栏()。我的代码如下所示:如何停止Pulse()函数(Python2.7、wxPython、EnhancedStatusBar)?,python,python-2.7,wxpython,Python,Python 2.7,Wxpython,我正在尝试为wxpythongui实现一个进度条。我使用了增强状态栏()。我的代码如下所示: for line in iter(proc.stdout.readline, ''): #Read stdout line by line self.gauge1.Pulse() wx.CallAfter(self.write_to_textctrl, line) #Appends line variable to TextCtrl 我试着在for循环之外执行self.gauge1.D
for line in iter(proc.stdout.readline, ''): #Read stdout line by line
self.gauge1.Pulse()
wx.CallAfter(self.write_to_textctrl, line) #Appends line variable to TextCtrl
我试着在for循环之外执行self.gauge1.Destroy(),但没有成功。那么,当脉冲函数停止读取标准输出时,我该如何使其停止呢?我猜您的过程不会结束。您应该添加一个检查,查看
行
是否为空,并在那里中断循环。然后您可以在仪表上调用Destroy()
请注意,除了您提到的小部件之外,wxPython还有
wx.Gauge
和PyGauge
。您可能也想尝试其中一种方法。我猜您的过程不会结束。您应该添加一个检查,查看行
是否为空,并在那里中断循环。然后您可以在仪表上调用Destroy()
请注意,除了您提到的小部件之外,wxPython还有
wx.Gauge
和PyGauge
。您可能也想尝试其中一种方法。下面是一个简单的状态栏示例,其中包含一个进度栏,以调用ping
的子流程为例进行交互。希望你能从中获得一些好处
import wx
import subprocess
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='Statusbar progress')
panel = wx.Panel(self)
start_btn = wx.Button(panel, label='Start')
start_btn.Bind(wx.EVT_BUTTON, self.OnStart)
stop_btn = wx.Button(panel, label='Stop')
stop_btn.Bind(wx.EVT_BUTTON, self.OnStop)
self.Bind(wx.EVT_CLOSE, self.OnExit)
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer.Add(start_btn)
btn_sizer.Add(stop_btn)
panel.SetSizer(btn_sizer)
self.statusbar = self.CreateStatusBar(3)
self.text1 = wx.StaticText(self.statusbar,-1,("Static text"))
self.text2 = wx.StaticText(self.statusbar,-1,("Count Text"))
self.progress_bar = wx.Gauge(self.statusbar, -1, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.text1, 0, wx.ALL, 5)
sizer.Add(self.text2, 1, wx.ALL, 5)
sizer.Add(self.progress_bar, 2, wx.ALL, 5)
self.statusbar.SetSizer(sizer)
self.Show()
self.progress_bar.SetRange(50)
self.progress_bar.SetValue(0)
def OnStart(self,event):
self.text1.SetLabelText("Started")
self.count = 0
self.proc = subprocess.Popen(['ping','127.0.0.1','-i','0.2'],stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
while True:
try:
list_data = self.proc.stdout.readline()
except:
break
if len(list_data) == 0:
break
self.progress_bar.Pulse()
self.count+=1
self.text2.SetLabelText("Count "+str(self.count))
wx.Yield()
def OnStop(self,event):
self.text1.SetLabelText("Stopped")
try:
self.proc.kill()
except:
pass
def OnExit(self,event):
try:
self.proc.kill()
except:
pass
self.Destroy()
if __name__ == '__main__':
app = wx.App()
frame = MainFrame()
app.MainLoop()
正如您所看到的,状态栏
内置了一个大小调整器,可用于项目的定位和相对大小调整。我添加了一个
Start
按钮,现在Stop
不会终止程序
下面是一个简单状态栏的示例,其中包含一个进度条,以调用
ping
的子流程为例进行交互。希望你能从中获得一些好处
import wx
import subprocess
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='Statusbar progress')
panel = wx.Panel(self)
start_btn = wx.Button(panel, label='Start')
start_btn.Bind(wx.EVT_BUTTON, self.OnStart)
stop_btn = wx.Button(panel, label='Stop')
stop_btn.Bind(wx.EVT_BUTTON, self.OnStop)
self.Bind(wx.EVT_CLOSE, self.OnExit)
btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
btn_sizer.Add(start_btn)
btn_sizer.Add(stop_btn)
panel.SetSizer(btn_sizer)
self.statusbar = self.CreateStatusBar(3)
self.text1 = wx.StaticText(self.statusbar,-1,("Static text"))
self.text2 = wx.StaticText(self.statusbar,-1,("Count Text"))
self.progress_bar = wx.Gauge(self.statusbar, -1, style=wx.GA_HORIZONTAL|wx.GA_SMOOTH)
sizer = wx.BoxSizer(wx.HORIZONTAL)
sizer.Add(self.text1, 0, wx.ALL, 5)
sizer.Add(self.text2, 1, wx.ALL, 5)
sizer.Add(self.progress_bar, 2, wx.ALL, 5)
self.statusbar.SetSizer(sizer)
self.Show()
self.progress_bar.SetRange(50)
self.progress_bar.SetValue(0)
def OnStart(self,event):
self.text1.SetLabelText("Started")
self.count = 0
self.proc = subprocess.Popen(['ping','127.0.0.1','-i','0.2'],stdin=subprocess.PIPE, stdout=subprocess.PIPE,stderr=subprocess.PIPE)
while True:
try:
list_data = self.proc.stdout.readline()
except:
break
if len(list_data) == 0:
break
self.progress_bar.Pulse()
self.count+=1
self.text2.SetLabelText("Count "+str(self.count))
wx.Yield()
def OnStop(self,event):
self.text1.SetLabelText("Stopped")
try:
self.proc.kill()
except:
pass
def OnExit(self,event):
try:
self.proc.kill()
except:
pass
self.Destroy()
if __name__ == '__main__':
app = wx.App()
frame = MainFrame()
app.MainLoop()
正如您所看到的,状态栏
内置了一个大小调整器,可用于项目的定位和相对大小调整。我添加了一个
Start
按钮,现在Stop
不会终止程序
使用Destroy()时出现另一个错误。这里是:提高PyDeadObjectError(Self.AtExtR%Surviv.NoNy)PyDaseObjeCaseAd惊恐:已经删除了规范对象的C++部分,不再允许属性访问。如何克服此错误?不要将字符串存储为Gauge类的属性。在销毁仪表之前,将其作为父级的属性或获取它。当我使用destroy()时,出现了另一个错误。这里是:提高PyDeadObjectError(Self.AtExtR%Surviv.NoNy)PyDaseObjeCaseAd惊恐:已经删除了规范对象的C++部分,不再允许属性访问。如何克服此错误?不要将字符串存储为Gauge类的属性。将其作为父级属性,或在销毁仪表之前获取它。感谢您分享一个示例。因为我不想关闭窗口,所以当我删除self.Destroy()时,进度条仍像一个选框样式的进度条一样移动。我想让这个过程一结束就停止。有什么我可以做到的吗?谢谢你分享一个例子。因为我不想关闭窗口,所以当我删除self.Destroy()时,进度条仍像一个选框样式的进度条一样移动。我想让这个过程一结束就停止。我有没有办法做到这一点?