Динамический системный трей текст (Python 3) - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь отобразить динамический текст в системном трее (это будет 2 цифры (от 1 до 100), которые меняются каждые 2 минуты).

Я нашел этот скрипт в качестве отправной точки (но я не обязуюсь!).

Но я получаю эту ошибку:

TypeError: Image.SetData(): arguments did not match any overloaded call:
  overload 1: argument 1 has unexpected type 'str'
  overload 2: argument 1 has unexpected type 'str'
OnInit returned false, exiting...

Соответствующая часть кода:

def Get(self,l,r):
        s=""+self.s_line
        for i in range(5):
            if i<(5-l):
                sl = self.sl_off
            else:
                sl = self.sl_on

            if i<(5-r):
                sr = self.sr_off
            else:
                sr = self.sr_on

            s+=self.s_border+sl+self.s_point+sr+self.s_point
            s+=self.s_border+sl+self.s_point+sr+self.s_point
            s+=self.s_line

        image = wx.EmptyImage(16,16)
        image.SetData(s)

        bmp = image.ConvertToBitmap()
        bmp.SetMask(wx.Mask(bmp, wx.WHITE)) #sets the transparency colour to white 

        icon = wx.EmptyIcon()
        icon.CopyFromBitmap(bmp)

        return icon

Я добавляю, чтобы обновить скрипт, добавив import wx.adv и заменив 2 wx.TaskBarIcon на wx.adv.TaskBarIcon.

Я в Windows 10 с Python 3.6

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Я нашел другой способ, используя Pillow и infi.systray

# text to image : Pillow (https://pillow.readthedocs.io/en/latest/handbook/tutorial.html - simple code sample:  https://code-maven.com/create-images-with-python-pil-pillow)
# icon in systray : infi.systray (https://github.com/Infinidat/infi.systray and https://stackoverflow.com/a/54082417/3154274)

# inspired by https://www.reddit.com/r/learnpython/comments/a7utd7/pystray_python_system_tray_icon_app/

# install PIL :  pip install Pillow
# install infi.systray : pip install infi.systray

from infi.systray import SysTrayIcon
from PIL import Image, ImageDraw,ImageFont
import time

image= "pil_text.ico"
n=1
while True:
    # create image
    img = Image.new('RGBA', (50, 50), color = (255, 255, 255, 90))  # color background =  white  with transparency
    d = ImageDraw.Draw(img)
    d.rectangle([(0, 40), (50, 50)], fill=(39, 112, 229), outline=None)  #  color = blue

    #add text to the image
    font_type  = ImageFont.truetype("arial.ttf", 25)
    a= n*10
    b = n*20
    d.text((0,0), f"{a}\n{b}", fill=(255,255,0), font = font_type)

    img.save(image)


    # display image in systray 
    if n==1:
        systray = SysTrayIcon(image, "Systray")
        systray.start()
    else:
        systray.update(icon=image)
    time.sleep(5)
    n+=1
systray.shutdown()

enter image description here

0 голосов
/ 31 марта 2019

Следующее использует текущую минуту и ​​секунду в качестве замены для номеров строк, но может быть легко адаптировано.

import wx
import wx.adv
import datetime
from wx.lib.embeddedimage import PyEmbeddedImage
#
# A white box 28x28 pixels
#
toggletest = PyEmbeddedImage(
    b'iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAIAAAD9b0jDAAAACXBIWXMAAAsTAAALEwEAmpwY'
    b'AAAAB3RJTUUH4wMfCgElTFaeRQAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJ'
    b'TVBkLmUHAAAAKElEQVRIx2P8//8/A7UBEwMNwKiho4aOGjpq6Kiho4aOGjpq6OAzFADRYgM1'
    b'8cIRtgAAAABJRU5ErkJggg==')

class TaskBarIcon(wx.adv.TaskBarIcon):
    def __init__(self, frame):
        self.frame = frame
        self.toggle = 0
        wx.adv.TaskBarIcon.__init__(self)
        self.Bind(wx.adv.EVT_TASKBAR_LEFT_DOWN, self.OnToggle)
        self.font = wx.SystemSettings.GetFont(wx.SYS_SYSTEM_FONT)
        self.font.SetPointSize(8)
        self.OnSetIcon(self.NewIcon())

    def CreatePopupMenu(self):
        menu = wx.Menu()
        togglem = wx.MenuItem(menu, wx.NewId(), 'Toggle Icon')
        menu.Bind(wx.EVT_MENU, self.OnToggle, id=togglem.GetId())
        menu.Append(togglem)
        menu.AppendSeparator()
        flashm = wx.MenuItem(menu, wx.NewId(), 'Flashing Icon')
        menu.Bind(wx.EVT_MENU, self.OnTimer, id=flashm.GetId())
        menu.Append(flashm)
        menu.AppendSeparator()
        quitm = wx.MenuItem(menu, wx.NewId(), 'Quit')
        menu.Bind(wx.EVT_MENU, self.OnQuit, id=quitm.GetId())
        menu.Append(quitm)
        return menu

    def NewIcon(self):
        bitmap = wx.Bitmap(toggletest.Bitmap)
        dc = wx.MemoryDC(bitmap)
        # Use current time as text, for want of something useful
        now = datetime.datetime.today()
        text = str(now.minute)+"\n"+str(now.second)
        dc.SetFont(self.font)
        dc.DrawText(text, 2, 2)
        del dc
        return bitmap

    def OnSetIcon(self, bitmap):
        icon = wx.Icon()
        icon.CopyFromBitmap(bitmap)
        self.SetIcon(icon)

    def OnToggle(self, event):
        bitmap = self.NewIcon()
        self.OnSetIcon(bitmap)

    def OnTimer(self,event):
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnUseTimer)
        self.timer.Start(1000)

    def OnUseTimer(self,event):
        self.OnToggle(None)

    def OnQuit(self, event):
        self.RemoveIcon()
        wx.CallAfter(self.Destroy)
        self.frame.Close()

if __name__ == '__main__':
    app = wx.App()
    frame=wx.Frame(None)
    TaskBarIcon(frame)
    app.MainLoop()

Результат - белая коробка ниже с 22 над 33

enter image description here

...