2010-07-12 2 views
1

다음 파이썬 모듈이 있습니다. 죄송 코드가 추한 경우. 이것은 내 첫 번째 파이썬 GUI 응용 프로그램이며 나는 파이썬에도 상당히 익숙하다. 할 일 목록이있는 일종의 카운트 다운 타이머입니다. 이 프로그램을 실행 한 후 그 이후 이분을 제외하고 좀 잘 작동, 그것은 다음과 같은 오류와 충돌 :1 분 후에 판고 오류가 발생했습니다.

Pango:ERROR:/build/buildd/pango1.0-1.28.0/pango/pango-layout.c:3739:pango_layout_check_lines: assertion failed: (!layout->log_attrs) 

나는 그 무엇도 의미 전혀 모른다. 내가 혼란스러워하는 것은 처음 1 분 후에 작동한다는 것입니다. 타이머 라벨은 아래로 카운트 다운하지만 다음 순간에는 즉시 충돌합니다.

약간의 인터넷 검색을 한 후이 문제는 멀티 스레딩과 관련이있을 것이라고 생각하십니까? 어떤 아이디어?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# generated by wxGlade 0.6.3 on Fri Jul 9 17:00:08 2010 

import wx 
import settimer 

# begin wxGlade: extracode 
# end wxGlade 

class MyFrame(wx.Frame): 
    def __init__(self, *args, **kwds): 
     # begin wxGlade: MyFrame.__init__ 
     kwds["style"] = wx.DEFAULT_FRAME_STYLE 
     wx.Frame.__init__(self, *args, **kwds) 
     self.todo1 = wx.TextCtrl(self, -1, "") 
     self.timer_label1 = wx.StaticText(self, -1, "00:00") 
     self.set_timer1 = wx.Button(self, -1, "Set Timer") 
     self.todo2 = wx.TextCtrl(self, -1, "") 
     self.timer_label2 = wx.StaticText(self, -1, "00:00") 
     self.set_timer2 = wx.Button(self, -1, "Set Timer") 
     self.todo3 = wx.TextCtrl(self, -1, "") 
     self.timer_label3 = wx.StaticText(self, -1, "00:00") 
     self.set_timer3 = wx.Button(self, -1, "Set Timer") 
     self.todo4 = wx.TextCtrl(self, -1, "") 
     self.timer_label4 = wx.StaticText(self, -1, "00:00") 
     self.set_timer4 = wx.Button(self, -1, "Set Timer") 
     self.todo5 = wx.TextCtrl(self, -1, "") 
     self.timer_label5 = wx.StaticText(self, -1, "00:00") 
     self.set_timer5 = wx.Button(self, -1, "Set Timer") 
     self.hours = 0 
     self.minutes = 0 

     self.__set_properties() 
     self.__do_layout() 

     self.Bind(wx.EVT_BUTTON, self.on_set1, self.set_timer1) 
     self.Bind(wx.EVT_BUTTON, self.on_set2, self.set_timer2) 
     self.Bind(wx.EVT_BUTTON, self.on_set3, self.set_timer3) 
     self.Bind(wx.EVT_BUTTON, self.on_set4, self.set_timer4) 
     self.Bind(wx.EVT_BUTTON, self.on_set5, self.set_timer5) 
     # end wxGlade 

    def __set_properties(self): 
     # begin wxGlade: MyFrame.__set_properties 
     self.SetTitle("Track Work") 
     self.todo1.SetMinSize((300, 25)) 
     self.timer_label1.SetMinSize((100, 30)) 
     self.timer_label1.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.set_timer1.SetMinSize((85, 27)) 
     self.todo2.SetMinSize((300, 25)) 
     self.timer_label2.SetMinSize((100, 30)) 
     self.timer_label2.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.set_timer2.SetMinSize((85, 27)) 
     self.todo3.SetMinSize((300, 25)) 
     self.timer_label3.SetMinSize((100, 30)) 
     self.timer_label3.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.set_timer3.SetMinSize((85, 27)) 
     self.todo4.SetMinSize((300, 25)) 
     self.timer_label4.SetMinSize((100, 30)) 
     self.timer_label4.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.set_timer4.SetMinSize((85, 27)) 
     self.todo5.SetMinSize((300, 25)) 
     self.timer_label5.SetMinSize((100, 30)) 
     self.timer_label5.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.set_timer5.SetMinSize((85, 27)) 
     # end wxGlade 

    def __do_layout(self): 
     # begin wxGlade: MyFrame.__do_layout 
     flex_sizer = wx.FlexGridSizer(5, 3, 2, 25) 
     flex_sizer.Add(self.todo1, 0, 0, 0) 
     flex_sizer.Add(self.timer_label1, 0, 0, 0) 
     flex_sizer.Add(self.set_timer1, 0, 0, 0) 
     flex_sizer.Add(self.todo2, 0, 0, 0) 
     flex_sizer.Add(self.timer_label2, 0, 0, 0) 
     flex_sizer.Add(self.set_timer2, 0, 0, 0) 
     flex_sizer.Add(self.todo3, 0, 0, 0) 
     flex_sizer.Add(self.timer_label3, 0, 0, 0) 
     flex_sizer.Add(self.set_timer3, 0, 0, 0) 
     flex_sizer.Add(self.todo4, 0, 0, 0) 
     flex_sizer.Add(self.timer_label4, 0, 0, 0) 
     flex_sizer.Add(self.set_timer4, 0, 0, 0) 
     flex_sizer.Add(self.todo5, 0, 0, 0) 
     flex_sizer.Add(self.timer_label5, 0, 0, 0) 
     flex_sizer.Add(self.set_timer5, 0, 0, 0) 
     self.SetSizer(flex_sizer) 
     flex_sizer.Fit(self) 
     self.Layout() 
     # end wxGlade 
    def on_set1(self, event): # wxGlade: MyFrame.<event_handler> 
     app = wx.PySimpleApp(0) 
     wx.InitAllImageHandlers() 
     MyTimer = settimer.Timer(None, -1, "") 
     MyTimer.get_out_instance(self) 
     app.SetTopWindow(MyTimer) 
     MyTimer.Show() 
     app.MainLoop() 
     event.Skip() 

    def set_label(self): 
     self.timer_label1.SetLabel("%02d:%02d" % (self.hours, self.minutes)) 
     self.minutes -= 1 

# end of class MyFrame 

if __name__ == "__main__": 
    app = wx.PySimpleApp(0) 
    wx.InitAllImageHandlers() 
    main_frame = MyFrame(None, -1, "") 
    app.SetTopWindow(main_frame) 
    main_frame.Show() 
    app.MainLoop() 

timer.py

import threading 
import time 

class Timer(threading.Thread): 
    def __init__(self, seconds, track): 
     threading.Thread.__init__(self) 
     self.total_time = seconds 
     self.track = track 

    def run(self): 
     for sec in range(self.total_time): 
      time.sleep(60) 
      self.track.set_label() 

당신은 대기 시간의 대부분을 할 것이다 스레드를 시작하는 대신 wx.Timer을 사용해야

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
# generated by wxGlade 0.6.3 on Fri Jul 9 16:49:11 2010 

import wx 
import timer 

# begin wxGlade: extracode 
# end wxGlade 



class Timer(wx.Frame): 
    def __init__(self, *args, **kwds): 
     # begin wxGlade: Timer.__init__ 
     kwds["style"] = wx.DEFAULT_FRAME_STYLE 
     wx.Frame.__init__(self, *args, **kwds) 
     self.hours_text = wx.TextCtrl(self, -1, "") 
     self.hours = wx.StaticText(self, -1, "HH") 
     self.minutes_text = wx.TextCtrl(self, -1, "") 
     self.minutes = wx.StaticText(self, -1, "MM") 
     self.set = wx.Button(self, -1, "Set") 
     self.out_instance = None 
     self.__set_properties() 
     self.__do_layout() 

     self.Bind(wx.EVT_BUTTON, self.on_set, self.set) 
     # end wxGlade 

    def __set_properties(self): 
     # begin wxGlade: Timer.__set_properties 
     self.SetTitle("Set Timer") 
     self.hours_text.SetMinSize((40, 25)) 
     self.hours.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.minutes_text.SetMinSize((40, 25)) 
     self.minutes.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.BOLD, 0, "")) 
     self.set.SetMinSize((50, 27)) 
     # end wxGlade 

    def __do_layout(self): 
     # begin wxGlade: Timer.__do_layout 
     flex_sizer = wx.FlexGridSizer(1, 5, 0, 4) 
     flex_sizer.Add(self.hours_text, 0, 0, 0) 
     flex_sizer.Add(self.hours, 0, wx.ALIGN_CENTER_VERTICAL, 0) 
     flex_sizer.Add(self.minutes_text, 0, 0, 0) 
     flex_sizer.Add(self.minutes, 0, wx.ALIGN_CENTER_VERTICAL, 0) 
     flex_sizer.Add(self.set, 0, wx.ALIGN_CENTER_VERTICAL, 0) 
     self.SetSizer(flex_sizer) 
     flex_sizer.Fit(self) 
     flex_sizer.AddGrowableRow(1) 
     flex_sizer.AddGrowableCol(3) 
     self.Layout() 
     # end wxGlade 

    def get_out_instance(self, out): 
     # get the instance of trackwork 
     # this method is meant to be called outside this class 
     self.out_instance = out 

    def on_set(self, event): # wxGlade: Timer.<event_handler> 
     self.out_instance.hours = int(self.hours_text.GetValue()) 
     self.out_instance.minutes = int(self.minutes_text.GetValue()) 
     self.out_instance.set_label() 
     t = timer.Timer(self.out_instance.minutes, self.out_instance) 
     t.start() 
     self.Destroy() 
     event.Skip() 

# end of class Timer 

답변

0

settimer.py.

wx.Timer은 지정된 간격으로 코드를 호출합니다.

+0

흠, 매우 흥미 롭습니다. 문제가 해결되었습니다. 감사! –