wxpython 系统托盘程序中出现的问题
写了个关于tbicon的程序。
有以下问题不能解决:
1、icon显示不正常。准确的说是不明白怎么对应:ico对应的是BITMAP_TYPE_ICO?gif对应的是BITMAP_TYPE_GIF?那 svg文件对应什么?png呢?那个BITMAP_TYPE_XBM和BITMAP_TYPE_XPM类型是怎么使用的?
2、程序不稳定。同样代码,在eclips调试的时候,大部分时间能正常显示,但有时候图标不能显示,能ps到进程。正常执行的时候,图标从未正常显示,或者是看不到,只能ps到进程;或者状态栏一下子拉到最长,怀疑是图片载入时发生问题。
3、我在tbicon上用右键点击绑定退出功能。调试环境能够正常退出,正常执行时,尽管不能显示图标,但是出现长条图片(也就是上个问题所描述的状态栏拉到最长的情况),这时用右键能让图标消失,但还是能ps到进程。
4、总觉得我的thread方法用的不太对。原来想在run()中直接写:wx.MessageBox("inofrmation")的,但是不成功,不知道为什么。只能重新定义一个基于wx.App的类,在run里面创建并调用。
另外,我用的python是2.4。本人写代码经验不多,发现可笑之处,敬请指教。以下附上源代码:
#!/usr/bin/python
import time
import MySQLdb
import wx
from threading import Thread
conn=MySQLdb.Connection('localhost','sysuser','sysuser','sysuser_db')
cur=conn.cursor()
cur.execute('delete from schedule where time<'+time.strftime("%Y%m%d%H%M"))
class TaskBarApp(wx.Frame):
def __init__(self,parent,id,title):
wx.Frame.__init__(self, parent, -1, title, size = (1,1),style=wx.FRAME_NO_TASKBAR|wx.NO_FULL_REPAINT_ON_RESIZE)
self.tbicon = wx.TaskBarIcon()
self.tbicon.SetIcon(wx.Icon('alarm.gif', wx.BITMAP_TYPE_GIF), '')
wx.EVT_TASKBAR_RIGHT_UP(self.tbicon,self.OnTaskBarRightClick)
self.Show(True)
#右键退出部分代码
def OnTaskBarRightClick(self,event):
self.tbicon.Destroy()
self.Close(True)
wx.GetApp().ProcessIdle()
return True
class TimeCheck(Thread):
def run(self):
while True:
cur.execute('select time from schedule order by time')
row=cur.fetchone()
settedtime=row[0]
if time.strftime("%Y%m%d%H%M")==settedtime:
cur.execute('select task from schedule where time='+settedtime)
row=cur.fetchone()
settedtask=row[0]
cur.execute('delete from schedule where time='+settedtime)
MesgApp().CallMsg(settedtask)
else:
cur.execute('select time from schedule order by time')
settedtime=row[0]
time.sleep(5)
class MesgApp(wx.App):
def CallMsg(self,input):
wx.MessageBox(input)
class App(wx.App):
def OnInit(self):
frame=TaskBarApp(None, -1, '')
frame.Center(wx.BOTH)
frame.Show(False)
timecheck=TimeCheck()
timecheck.start()
return True
def main():
app = App(0)
app.MainLoop()
if __name__ == '__main__':
main()