#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
from tkinter import *
from tkinter.messagebox import askyesno, showerror, showinfo
from irkit_com import get_irkit_info, get, post, delete # IRKit操作コマンド
save_dir = os.environ['HOME'] + '/' + '.irkit.d' # Getした赤外線信号の保存先ディレクトリ名
help_win = None
get_win = None
def help_window():
'''Help window'''
global help_win
if help_win == None or not help_win.winfo_exists():
help_win = Toplevel() # ヘルプ用の新しいウィンドウを作る
help_win.title('IRKit Help') # ウィンドウのタイトル
help_text = '''QuickIRの使用方法
IRKitメニュー
[GET...] 受信した赤外線信号を保存
[POST] 選択した赤外線信号を送信
[Delete] 選択した赤外線信号を削除
[Quit] 終了
Helpメニュー
[Help...] ヘルプの表示
[About...] QuickIRについて'''
Message(help_win, text=help_text, width=320, justify='left').pack(side='left')
help_win.resizable(0, 0) # リサイズの禁止
def about_QuickIR():
'''About message'''
showinfo(title='about', message='QuickIR Ver.0.2.0')
def show_error(msg):
'''Print error message'''
showerror(title='QuickIR error', message=msg)
def confirm(msg):
'''Confirm dialog'''
return askyesno(title='QuickIR confirming', message=msg, default='no')
class Application(Frame):
'''IRKit application class'''
def __init__(self, master):
master.title('QuickIR') # ウィンドウのタイトル
master.minsize(240, 200) # ウィンドウの最小サイズを制限
Frame.__init__(self, master, borderwidth=4, bg='#d0d0d0')
self.pack(expand=True, fill='both')
self.createMenu(master)
self.createWidgets()
def get_signal(self):
'''Get IR signal Dialog'''
global get_win
def save(*args):
'''Save IR signal'''
signame = self.en.get()
if signame:
info = get_irkit_info()
if get(info['IPaddress'], info['Port'], signame): # irkit_com.get()
self.insert2list()
else:
show_error('受信した赤外線信号がありません')
get_win.destroy() # GET dialogを閉じる
else:
show_error('信号名を入力してください')
if get_win == None or not get_win.winfo_exists():
get_win = Toplevel() # GET dialogを作る
get_win.resizable(0, 0) # リサイズの禁止
# ラベル, Entry(入力フィールド), ボタンを作る
Label(get_win, text='最後に受信した赤外線信号を保存します。').grid(column=0, row=0, columnspan=3)
Label(get_win, text='信号名:').grid(column=0, row=1, sticky='w')
self.en = en = Entry(get_win, width=24)
en.grid(column=1, row=1, padx=8, columnspan=2)
Button(get_win, text='Save', command=save).grid(column=1, row=2)
Button(get_win, text='Cancel', command=get_win.destroy).grid(column=2, row=2)
#
en.focus_set() # 入力フィールドにフォーカス
en.bind('<Return>', save) # リターンキーでも保存
def send_signal(self, *args):
'''赤外線信号の送信'''
signame = self.lb.get('anchor')
if signame:
info = get_irkit_info()
post(info['IPaddress'], info['Port'], signame) # irkit_com.post()
else:
show_error('赤外線信号が選択されていません')
def delete_signal(self):
'''赤外線信号の削除'''
signame = self.lb.get('anchor')
if signame:
if confirm('"{0}"を削除します。よろしいですか?'.format(signame)):
delete(signame) # irkit_com.delete()
self.insert2list()
else:
show_error('赤外線信号が選択されていません')
def createMenu(self, master):
'''メニューの作成'''
# メニューバー
menubar = Menu(master)
master.config(menu=menubar)
# IRKitメニュー
irkit_menu = Menu(menubar, tearoff=False)
menubar.add_cascade(label='IRKit', underline=0, menu=irkit_menu)
# IRKitメニュー項目
irkit_menu.add_command(label='GET...', under=0, command=self.get_signal)
irkit_menu.add_command(label='POST', under=0, command=self.send_signal)
irkit_menu.add_command(label='Delete', under=0, command=self.delete_signal)
irkit_menu.add_separator()
irkit_menu.add_command(label='Quit', under=0, command=sys.exit)
# HELPメニュー
help_menu = Menu(menubar, tearoff=False)
menubar.add_cascade(label='Help', underline=0, menu=help_menu)
# HELPメニュー項目
help_menu.add_command(label='Help...', under=0, command=help_window)
help_menu.add_command(label='Abount...', under=0, command=about_QuickIR)
def insert2list(self):
'''Insert IR signal list to Listbox'''
self.lb.delete(0, END)
for file in sorted(os.listdir(save_dir + '/signals')):
if file[0] != '.':
self.lb.insert(END, os.path.splitext(file)[0])
def createWidgets(self):
'''画面の作成'''
# Listbox
self.lb = lb = Listbox(self, width=40, height=10, selectmode=SINGLE, bd=4, relief=FLAT)
# Scrollbar
sb_y = Scrollbar(self, orient=VERTICAL, command=lb.yview)
lb.configure(yscrollcommand=sb_y.set)
# Listbox, ScrollbarをGridderで配置
lb.grid(column=0, row=0, sticky='news')
sb_y.grid(column=1, row=0, sticky='ns')
# リサイズ設定
self.grid_columnconfigure(index=0, weight=1)
self.grid_rowconfigure(index=0, weight=1)
# IR信号ファイルの一覧をListboxに表示
self.insert2list()
# バインディングの設定
lb.bind('<Double-1>', self.send_signal) # ダブルクリックで送信
def main():
root = Tk()
app = Application(master=root)
app.mainloop()
if __name__ == '__main__':
main()
|