我正在编写一个python脚本,每隔30分钟就可以获取特定区域的气候条件并发出弹出通知。
此代码在屏幕中央弹出一个令人讨厌的弹出窗口。我希望弹出窗口类似于linux中的notify-send [出现在右上角]并且消息在pybusyinfo窗口的中心对齐,并且如何将它对齐?
pybusyinfo中代码的任何更改都会有所帮助。
import requests
from bs4 import BeautifulSoup
import datetime,time
import wx
import wx.lib.agw.pybusyinfo as PBI
now = datetime.datetime.now()
hour=now.hour
# gets current time
def main():
chrome_path = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s'
g_link = 'http://www.accuweather.com/en/in/tambaram/190794/hourly-weather-forecast/190794?hour='+str(hour)
g_res= requests.get(g_link)
g_links= BeautifulSoup(g_res.text,"lxml")
if hour > 18 :
temp = g_links.find('td', {'class' :'first-col bg-s'}).text
climate = g_links.find('td', {'class' :'night bg-s icon first-col'}).text
else :
temp = g_links.find('td', {'class' :'first-col bg-c'}).text
climate = g_links.find('td', {'class' :'day bg-c icon first-col'}).text
for loc in g_links.find_all('h1'):
location=loc.text
info = location +' ' + str(now.hour)+':'+str(now.minute)
#print 'Temp : '+temp
#print climate
def showmsg():
app = wx.App(redirect=False)
title = 'Weather'
msg= info+'\n'+temp + '\n'+ climate
d = PBI.PyBusyInfo(msg,title=title)
return d
if __name__ == '__main__':
d = showmsg()
time.sleep(6)
while True:
main()
time.sleep(1800)
答案 0 :(得分:0)
screen_size = wx.DisplaySize()
d_size = d._infoFrame.GetSize()
pos_x = screen_size[0] - d_size[0] # Right - popup.width (aligned to right side)
pos_y = screen_size[1] - d_size[1] # Bottom - popup.height (aligned to bottom)
d.SetPosition((pos_x,pos_t))
d.Update() # force redraw ... (otherwise your "work " will block redraw)
将你需要的文本对齐为PyBusyFrame的子类
class MyPyBusyFrame(PBI.PyBusyFrame):
def OnPaint(self, event):
"""
Handles the ``wx.EVT_PAINT`` event for L{PyInfoFrame}.
:param `event`: a `wx.PaintEvent` to be processed.
"""
panel = event.GetEventObject()
dc = wx.BufferedPaintDC(panel)
dc.Clear()
# Fill the background with a gradient shading
startColour = wx.SystemSettings_GetColour(wx.SYS_COLOUR_ACTIVECAPTION)
endColour = wx.WHITE
rect = panel.GetRect()
dc.GradientFillLinear(rect, startColour, endColour, wx.SOUTH)
# Draw the label
font = wx.SystemSettings_GetFont(wx.SYS_DEFAULT_GUI_FONT)
dc.SetFont(font)
# Draw the message
rect2 = wx.Rect(*rect)
rect2.height += 20
#############################################
# CHANGE ALIGNMENT HERE
#############################################
dc.DrawLabel(self._message, rect2, alignment=wx.ALIGN_CENTER|wx.ALIGN_CENTER)
# Draw the top title
font.SetWeight(wx.BOLD)
dc.SetFont(font)
dc.SetPen(wx.Pen(wx.SystemSettings_GetColour(wx.SYS_COLOUR_CAPTIONTEXT)))
dc.SetTextForeground(wx.SystemSettings_GetColour(wx.SYS_COLOUR_CAPTIONTEXT))
if self._icon.IsOk():
iconWidth, iconHeight = self._icon.GetWidth(), self._icon.GetHeight()
dummy, textHeight = dc.GetTextExtent(self._title)
textXPos, textYPos = iconWidth + 10, (iconHeight-textHeight)/2
dc.DrawBitmap(self._icon, 5, 5, True)
else:
textXPos, textYPos = 5, 0
dc.DrawText(self._title, textXPos, textYPos+5)
dc.DrawLine(5, 25, rect.width-5, 25)
size = self.GetSize()
dc.SetPen(wx.Pen(startColour, 1))
dc.SetBrush(wx.TRANSPARENT_BRUSH)
dc.DrawRoundedRectangle(0, 0, size.x, size.y-1, 12)
然后你必须创建自己的BusyInfo函数来实现你的框架并将其返回(参见https://github.com/wxWidgets/wxPython/blob/master/wx/lib/agw/pybusyinfo.py#L251)