Skip to content

[Feature]: pystrayからTkEasyGUIのvaluesの中身を簡単に表示できるようにしてほしい。 #111

@t-yumo

Description

@t-yumo

Overview

TkEasyGUIとpystrayを組み合わせたときに
pystrayからTkEasyGUIのvaluesの中身を簡単に表示できるようにしてほしい。

Background

TkEasyGUI上でのスライダーの値等(values)をpystrayから読み取って表示したいが、
PySimpleGUIの時と違いdeepcopyを使わないとpystray側ではvaluesが空になる。

Proposal

TkEasyGUIで設定し、pystrayで設定を表示するようなプログラムを考えていたのですが、
TkEasyGUIではeventごとにvaluesをdeepcopyしないとうまくできませんでした。
TkEasyGUIのアップデートでPySimpleGUIのようにdeepcopyを使わずとも
pystrayからvaluesを共有できるようにすることは可能でしょうか。

PySimpleGUIを使用した場合

PySimpleGUI上でもpystray上でもvaluesの中身が共有されるようで普通に表示される。
このコードをそのままTkEasyGUIに置き換えるとpystray上ではvaluesの中身は空で表示される。

import PySimpleGUI as sg
import threading
from pystray import Icon, Menu, MenuItem
from PIL import Image

sl1_default = 5
sl2_default = 15


layout = [[sg.Text(str(sl1_default), key="-txt1-", size=(2,None)),
           sg.Slider(key="-sl1-", range=(1,10), default_value=sl1_default,
                     resolution=1, orientation="h",
                     disable_number_display=True, enable_events=True)],
          [sg.Text(str(sl2_default), key="-txt2-", size=(2,None)),
           sg.Slider(key="-sl2-", range=(11,20), default_value=sl2_default,
                     resolution=1, orientation="h",
                     disable_number_display=True, enable_events=True)],
          [sg.Text("values", key="-txt3-")],
          [sg.Button("GUIにvalues表示", key="-btn1-"),
           sg.Button("閉じる", key="-btn2-")]]
    
window = sg.Window(title="テストプログラム", layout=layout, font=(None,14))


def system_tray_values(): #システムトレイ(通知領域)にvaluesの中身を表示する関数

    global system_tray
    global values

    system_tray.remove_notification()
    system_tray.notify(str(values.items()))
    

def system_tray_start(): #システムトレイを作成する関数

    global system_tray
    global system_tray_count
    
    tray_icon = Image.open("icon.ico") #アイコンファイルの用意が必要
    tray_menu = Menu(MenuItem("トレーにvalues表示", system_tray_values,
                              default=True))
    system_tray = Icon(name="テストプログラム", icon=tray_icon,
                       title="テストプログラム", menu=tray_menu)
    system_tray.run()

    
threading.Thread(target=system_tray_start, daemon = True).start() #システムトレイの表示


while True:
        
    event, values = window.read(1)

    if event == "-sl1-":
        window["-txt1-"].update(int(values["-sl1-"]))

    if event == "-sl2-":
        window["-txt2-"].update(int(values["-sl2-"]))

    if event == "-btn1-":
        window["-txt3-"].update(values.items())

    if event == "-btn2-":
        break

    if event == sg.WIN_CLOSED:
        break

system_tray.stop()
window.close()

上記と同じ動きをTkEasyGUIで再現しようとした場合

eventごとにdeepcopyをする必要がある?

import TkEasyGUI as eg
import threading
from pystray import Icon, Menu, MenuItem
from PIL import Image
import copy

sl1_default = 5
sl2_default = 15

values_deep_copy_on = 1
values_deep_copy = {}


layout = [[eg.Text(str(sl1_default), key="-txt1-", size=(2,None)),
           eg.Slider(key="-sl1-", range=(1,10), default_value=sl1_default,
                     resolution=1, orientation="h",
                     disable_number_display=True, enable_events=True)],
          [eg.Text(str(sl2_default), key="-txt2-", size=(2,None)),
           eg.Slider(key="-sl2-", range=(11,20), default_value=sl2_default,
                     resolution=1, orientation="h",
                     disable_number_display=True, enable_events=True)],
          [eg.Text("values", key="-txt3-")],
          [eg.Button("GUIにvalues表示", key="-btn1-"),
           eg.Button("閉じる", key="-btn2-")]]
    
window = eg.Window(title="テストプログラム", layout=layout, font=(None,14))


def system_tray_values(): #システムトレイ(通知領域)にvaluesの中身を表示する関数

    global system_tray
    global values
    global values_deep_copy

    values = copy.deepcopy(values_deep_copy)
    system_tray.remove_notification()
    system_tray.notify(str(values.items()))
    

def system_tray_start(): #システムトレイを作成する関数

    global system_tray
    global system_tray_count
    
    tray_icon = Image.open("icon.ico") #アイコンファイルの用意が必要
    tray_menu = Menu(MenuItem("トレーにvalues表示", system_tray_values,
                              default=True))
    system_tray = Icon(name="テストプログラム", icon=tray_icon,
                       title="テストプログラム", menu=tray_menu)
    system_tray.run()

    
threading.Thread(target=system_tray_start, daemon = True).start() #システムトレイの表示


while True:
        
    event, values = window.read(1)

    if values_deep_copy_on == 1: #初回起動時にdeepcopyをする
        values["-sl1-"] = sl1_default
        values["-sl2-"] = sl2_default
        values_deep_copy = copy.deepcopy(values)
        values_deep_copy_on = 0

    if event == "-sl1-":
        window["-txt1-"].update(int(values["-sl1-"]))
        values_deep_copy = copy.deepcopy(values)

    if event == "-sl2-":
        window["-txt2-"].update(int(values["-sl2-"]))
        values_deep_copy = copy.deepcopy(values)

    if event == "-btn1-":
        window["-txt3-"].update(values.items())
        values_deep_copy = copy.deepcopy(values)

    if event == "-btn2-":
        break

    if event == eg.WIN_CLOSED:
        break

system_tray.stop()
window.close()

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions