【问题标题】:wxPython class doesnt show in windowwxPython 类不显示在窗口中
【发布时间】:2020-03-20 02:48:27
【问题描述】:

所以我创建了一个在 seperet 线程中运行大型计算的类。

这是我期望看到的:

这就是我所看到的:

这是框架类

class ThreadFrame(wx.Frame):

def __init__(self,parent=None):
    wx.Frame.__init__(self,parent=parent)
    self.frame = wx.Frame(None, title='Bitte Warten',style=wx.FRAME_NO_TASKBAR)
    self.frame.SetSize(500,100)
    self.panel=wx.Panel(self.frame)
    self.parent=parent
    self.WaitLbl=wx.StaticText(self.panel,-1)
    self.WaitLbl.SetLabel('Geotags werden ausgelesen und abgerufen.')
    self.progress = wx.Gauge(self.panel,size=(500,30), range=self.parent.list_ctrl.GetItemCount())
    self.btn = wx.Button(self.panel,label='Abbrechen')
    self.btn.Bind(wx.EVT_BUTTON, self.OnExit)

    self.Sizer=wx.BoxSizer(wx.VERTICAL)          

    #Add Widgets LeftSizer
    self.Sizer.Add(self.WaitLbl,0,wx.ALL|wx.CENTER,5)
    self.Sizer.Add(self.progress,0,wx.ALL,5)
    self.Sizer.Add(self.btn,0,wx.ALL|wx.CENTER,5)


    self.panel.SetSizer(self.Sizer)
    self.Sizer.Fit(self.panel)
    self.panel.Layout()            
    self.Centre()            



    #Bind to the progress event issued by the thread
    self.Bind(EVT_PROGRESS_EVENT, self.OnProgress)
    #Bind to Exit on frame close
    #self.Bind(wx.EVT_CLOSE, self.OnExit)
    self.Show()

    self.mythread = TestThread(self.frame, self.parent)
    #Enable the GUI to be responsive by briefly returning control to the main App
    while self.mythread.isAlive():
        time.sleep(0.1)
        wx.GetApp().Yield()
        continue

    try:
        self.OnExit(None)
    except:
        pass

def OnProgress(self, event):
    self.progress.SetValue(event.count)
    #or for indeterminate progress
    #self.progress.Pulse()

def OnExit(self, event):
    if self.mythread.isAlive():
        print('Thread lebt noch')
        self.mythread.terminate() # Shutdown the thread
        print('Thread wird beendet')
        self.mythread.join() # Wait for it to finish

    self.Close()

这是运行计算的线程

class TestThread(Thread):
def __init__(self,parent_target,toplevel):
    Thread.__init__(self)
    self.parent = toplevel
    self.ownparent=parent_target
    self.stopthread = False
    self.start()    # start the thread

def run(self):
    print('Thread gestartet')
    i=0
    while self.stopthread == False:        
           #if calculation is not finished:
                #do calculation and count i one up
                evt = progress_event(count=i)

                    #Send back current count for the progress bar
                try:
                    wx.PostEvent(self.ownparent, evt)

                except: # The parent frame has probably been destroyed

                    self.terminate()
                i=i+1
        else:
            print('Thread Terminated')
            self.terminate()


def terminate(self):
    self.stopthread = True

这就是我从主程序中调用类的方式:

frame=ThreadFrame(self)

主程序还打开了一个框架。所以这是一个打开的框架,然后启动一个执行计算然后停止的线程。 我想这就是所有要知道的。我用伪代码替换了计算,因为我的大脑很痛,我现在无法想出一个plahold。但我觉得在所有的配件和尺寸器以及面板和框架之间我错了。我现在完全不看所有这些东西。

【问题讨论】:

    标签: python-3.x wxpython wxwidgets


    【解决方案1】:

    您显示的代码似乎与屏幕截图不符。无论您的布局有什么问题,框架标题中都应该有“Bitte warten”,但您的屏幕截图甚至没有显示这一点。要么您根本没有执行您显示的代码,要么您在代码的其他地方创建了一些其他框架,您在此处看到。或者,当然,您上传了错误的屏幕截图或代码版本。但是有些东西不适合这里。

    【讨论】:

    • 这确实是我打开的第二个窗口。那是问题吗?我给的父母有另一个窗口,里面有他自己的面板和尺寸器。但这些工作正常。
    • @Odatas 拥有多个窗口不是问题。您的框架标题没有显示“Bitte warten”是一个问题。 IE。这不是正确的框架。
    【解决方案2】:

    所以我不确定是什么导致了问题。我从头开始,现在它可以工作了。这次我没有使用新框架,因为该类本身已经是一个框架。

    class GeoThreadFrame(wx.Frame):
    
    def __init__(self, radsteuer):
        wx.Frame.__init__(self,parent=radsteuer.frame,style=wx.DEFAULT_FRAME_STYLE | wx.STAY_ON_TOP|wx.FRAME_NO_TASKBAR)
        panel = wx.Panel(self)
        self.SetWindowStyle(wx.FRAME_NO_TASKBAR|wx.STAY_ON_TOP)
    
        self.progress = wx.Gauge(panel,size=(300,30), pos=(10,50), range=radsteuer.list_ctrl.GetItemCount())
    
        self.btn = wx.Button(panel,label='Abbrechen', size=(200,30), pos=(10,10))
        self.btn.Bind(wx.EVT_BUTTON, self.OnExit)
        panel.Center()
        #Bind to the progress event issued by the thread
        self.Bind(EVT_PROGRESS_EVENT, self.OnProgress)
        #Bind to Exit on frame close
        self.Bind(wx.EVT_CLOSE, self.OnExit)
        self.Center()
        self.Show()
    
        self.mythread = GeoLocationThread(self, radsteuer)
        #Enable the GUI to be responsive by briefly returning control to the main App
        while self.mythread.isAlive():            
            #time.sleep(0.1)
            wx.GetApp().Yield()
            continue
    
        try:
            self.OnExit(None)
        except:
            pass
    
    def OnProgress(self, event):
        self.progress.SetValue(event.count)
        #or for indeterminate progress
        #self.progress.Pulse()
    
    def OnExit(self, event):
    
        if self.mythread.isAlive():            
            self.mythread.terminate() # Shutdown the thread            
            #self.mythread.join(3) # Wait for it to finish            
        self.Destroy()
    
    class GeoLocationThread(Thread):
        def __init__(self,parent_target,mainparent):
            Thread.__init__(self)
            self.parent = parent_target
            self.mainparent=mainparent
            self.stopthread = False
            self.start()    # start the thread
    
        def run(self):
            # A loop that will run for 5 minutes then terminate
            i=0
            while self.stopthread == False:
    
    
                if i < self.mainparent.list_ctrl.GetItemCount():
                    self.calculation(i)
                    evt = progress_event(count=i)
                    i=i+1
                    #Send back current count for the progress bar
                    try:
                        wx.PostEvent(self.parent, evt)
                    except: # The parent frame has probably been destroyed
                        self.terminate()
                else:
                    self.terminate()
    
        def terminate(self):
    
            self.stopthread = True
    
        def calculate(self,i):
            #your calculation here
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 2010-11-21
      • 2019-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-21
      • 1970-01-01
      相关资源
      最近更新 更多