2016-06-28 1 views
0

J'écris un script python pour obtenir les conditions climatiques dans une zone particulière toutes les 30 minutes et donner une notification contextuelle.Comment personnaliser la fenêtre pybusyinfo dans (Windows OS) pour la faire apparaître dans le coin supérieur de la fenêtre et les autres options de formatage?

Ce code donne un popup au centre de l'écran qui est ennuyeux. Je souhaite avoir le popup similaire à notify-send in linux [qui apparaît dans le coin droit] et le message est aligné au centre de la fenêtre pybusyinfo, et comment l'aligner à droite?

Tout changement de code dans pybusyinfo serait utile.

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) 

Répondre

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) 

pour aligner le texte que vous aurez besoin de sous-classe 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) 

alors vous devez créer votre propre fonction BusyInfo que instancié votre cadre et retourne (voir https://github.com/wxWidgets/wxPython/blob/master/wx/lib/agw/pybusyinfo.py#L251)

+0

d_size = d.GetSize() AttributeError: l'objet 'PyBusyInfo' n'a pas d'attribut 'GetSize' –

+0

il ressemble à PyBusyInfo ... n'est pas le frame réelle ... voir edit (_infoframe) –

+0

d._infoFrame.SetPosition ((pos_x, pos_y)) –