如何在Windows操作系统中自定义pybusyinfo窗口,使其出现在窗口的顶部角落,并提供其他格式选项?

2024-10-01 17:26:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个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)

Tags: textimporttimecollinksfindtempnow
1条回答
网友
1楼 · 发布于 2024-10-01 17:26:41
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

相关问题 更多 >

    热门问题