絖綛 N@i.jp  昨日:00044348
 今日:00037432
 総計:00235165
keywords
管理者専用
  Post   Add link   Control Panel 































新しいトピック
最新:04/16 19:55


新しいコメント
最新:07/28 16:47






管理人へMAIL

プライバシーポリシー

QuickIRがMacOS Xではうまく動いてくれない

どうやらMacOS XのTcl/Tkに問題があるらしい


 進みが悪いQuickIRプログラムですが、実はここ何日もMacOS Xでのおかしな挙動に悩まされているのです。
 おかしな挙動というのは以下の2つです。

  • Entryウィジェット(入力フィールド)に日本語を入力できない
  • GETダイアログをモーダルダイアログにしたら、Entryウィジェットにフォーカスできず何も入力できなくなる

 どうもMacOS XのTcl/Tkのバグっぽい感じです。縮小したバグ再現プログラムが以下です。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import sys
from tkinter import *

class Dialog(Toplevel):
    '''Dialog class'''
    def __init__(self, parent, title=None):
        Toplevel.__init__(self, parent)
        self.geometry('+{0:d}+{1:d}'.format(parent.winfo_rootx()+20,
                                            parent.winfo_rooty()+20))
        self.resizable(0, 0)
        self.transient(parent)

        if title:
            self.title(title)
        self.parent = parent
        self.buttonbox()
        body = Frame(self)
        body.grid(column=0, row=0, padx=5, pady=5)

        self.initial_focus = self.body(body)
        if not self.initial_focus:
            self.initial_focus = self
        self.initial_focus.focus_set()
        self.protocol('WM_DELETE_WINDOW', self.cancel)

        self.grab_set()
        self.wait_window(self)

    def body(self, master):
        pass

    def button box(self):
        box = Frame(self)
        self.button1 = b1 = Button(box, text='OK', width=10,command=self.ok, default=ACTIVE)
        self.button2 = b2 = Button(box, text='Cancel', width=10, command=self.cancel)
        b1.pack(side=LEFT, padx=5, pady=5)
        b2.pack(side=LEFT, padx=5, pady=5)
        box.grid(column=0, row=1)

    def ok(self, event=None):
        if not self.validate():
            self.initial_focus.focus_set()
            return
        self.withdraw()
        self.update_idletasks()
        self.apply()
        self.cancel()

    def cancel(self, event=None):
        self.parent.focus_set()
        self.destroy()

    def validate(self):
        return True

    def apply(self):
        pass

class Application(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.pack(expand=True, fill='both')
        Button(self, text='Open', command=self.open_dialog).pack()
        Button(self, text='Quit', command=master.destroy).pack()
        self.createMenu(master)

    def createMenu(self, master):
        menubar = Menu(master)
        master.config(menu=menubar)
        file_menu = Menu(menubar, tearoff=False)
        menubar.add_cascade(label='File', menu=file_menu)
        file_menu.add_command(label='Open', under=0, command=self.open_dialog)

    def open_dialog(self):
        class My_Dialog(Dialog):
            def body(self, master):
                Label(master, text='Label').grid(column=0, row=0)
                self.e = Entry(master, width=20)
                self.e.grid(column=1, row=0)
                return self.e

        d = My_Dialog(self.master)

root = Tk()
app = Application(master=root)
app.mainloop()

 モーダルダイアログというのは、ダイアログを閉じない限りアプリの他の操作はできないというダイアログのことです。QuickIRで言えば、GETメニューで赤外線信号の取得・保存が完了しない限り、POST(赤外線信号を送信する)等の他の操作はできないようにする事になります。
 参考にさせていただいたのがDialog Windowsというページ。このページのDialogクラスをほぼ流用させていただきました。

 上記のプログラムを実行すると、"Open"と"Quit" の2つのボタンが表示されている小さなウィンドウが作成されます。また"File"メニューが作成され、そこには"Open"メニュー項目があります。そして"Open"ボタンと"Open"メニュー項目のどちらからでもMy_Dialogが表示されるようになっています。
 My_DialogにはEntryウィジェット(入力フィールド)があり、これにフォーカス(入力フィールドにカーソルが表示されて入力可能状態になる)されるようにしてあります。

 先ず"Open"ボタンをクリックしてみますと、以下のようなダイアログが表示されます。入力フィールドにはカーソルが表示されて入力が可能な状態になっています。

 キーボードから入力してみると、英数字や記号なら入って行きますが、日本語はどうやっても入力できません。日本語入力モードになっていてもカナ漢字変換できず、キーボードから打ち込んだ半角英数字がそのまま入っていくだけです。

 ダイアログの"OK"か"Cancel"のボタンをクリックしてダイアログを閉じ、次は"File"メニューの"Open"メニュー項目を選択してみます。すると、同じようにダイアログが表示されるのですが、今度は入力フィールドにはフォーカスされておらず、入力フィールドをクリックしても入力可能な状態になりません。

 これらの原因はMacOS Xに含まれている Apple版Tcl/Tkにあるようです。MacOS XのUIに合わせるようにTcl/Tkに改造が加えられているようなのですが、メニューバーがアプリのウィンドウではなく常に画面上部に表示されるという特殊さから来る不具合や、日本語入力に対応していないという問題がある様子です。
 という原因っぽいところまでは分かったのですが、じゃあどのように直せば良いのか全く分かりませ〜ん。という事で何日もジタバタしています。


< 過去の記事 [ 10月の 全てのカテゴリ リスト ] 新しい記事 >

2015 calendar
10月
123
45678910
11121314151617
18192021222324
25262728293031


掲示板
最新:08/15 17:19


GsBlog was developed by GUSTAV, Copyright(C) 2003, Web Application Factory All Rights Reserved.