2016-06-28 1 views
0

Ich schreibe ein Python-Skript, um die klimatischen Bedingungen in einem bestimmten Gebiet alle 30 Minuten zu erhalten und gebe ein Popup-Benachrichtigung.Wie pybusyinfo Fenster in (Windows OS) anpassen, damit es in der oberen Ecke des Fensters und den anderen Formatierungsoptionen erscheint?

Dieser Code gibt Popup in der Mitte des Bildschirms, die nervig ist. Ich möchte das Popup ähnlich zu notify-send in linux [die in der rechten Ecke erscheint] und die Nachricht ist in der Mitte von pybusyinfo Fenster ausgerichtet, und wie man es richtig anordnet?

Jede Änderung des Codes in pybusyinfo wäre hilfreich.

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) 

Antwort

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) 

den Text ausrichten müssen Sie 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) 

dann Unterklasse würden Sie haben Ihre eigene BusyInfo Funktion erstellen, die den Rahmen instanziiert und gibt es (siehe https://github.com/wxWidgets/wxPython/blob/master/wx/lib/agw/pybusyinfo.py#L251)

+0

d_size = d.GetSize() AttributError: 'PyBusyInfo' Objekt hat kein Attribut 'GetSize' –

+0

es sieht aus wie PyBusyInfo ... ist nicht die aktueller Rahmen ... siehe Bearbeiten (_infoframe) –

+0

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

Verwandte Themen