| ■ | リストボックスとスクロールバー |
from Tkinter import *
import tkMessageBox, os.path, string
def j(str, encoding="japanese.shift_jis"):
return unicode(str, encoding).encode("utf8")
class App(Frame):
def init(self):
self.master.title("ファイルエントリの検索")
fa = Frame(self)
la = Label(fa, text=j("ディレクトリ名:"))
self.dirNameVar = StringVar()
self.dirNameVar.set("C:/usr/lang/python")
ea = Entry(fa, width=40, textvariable=self.dirNameVar)
ba = Button(fa, text=j("検索"), command=self.search)
for e in [la, ea, ba]: e.pack(side=LEFT)
fb = Frame(self)
# リストボックスとスクロールバー
self.lsta = Listbox(fb, selectmode="single", width=30, height=6)
scrv = Scrollbar(fb, orient=VERTICAL, command=self.lsta.yview)
scrh = Scrollbar(fb, orient=HORIZONTAL, command=self.lsta.xview)
self.lsta.config(xscrollcommand=scrh.set, yscrollcommand=scrv.set)
# bindコマンドによるイベントのバインド
# 登録する関数には「event」オブジェクトの引数が自動的に渡されます。
self.lsta.bind(" |
Tkinterのリストボックスの一番のホネは、 スクロールバーとのリンケージです。 これはTcl/Tkのときと同様、決まった書き方があるので、 毎回これを使い回せばよいでしょう。 注意点は、リストボックスとスクロールバーで、 command=オプションやxscrollcommand=オプションの値として互いのインスタンスメソッドを呼び合う形になるので、 下のように片方のインスタンスは2段階の処理を行う必要があります。
self.lsta = Listbox(fa, selectmode="single", width=30, height=6) scrv = Scrollbar(fa, orient=VERTICAL, command=self.lsta.yview) scrh = Scrollbar(fa, orient=HORIZONTAL, command=self.lsta.xview) self.lsta.config(xscrollcommand=scrh.set, yscrollcommand=scrv.set) |
self.lsta.bind("<Double-Button-1>", self.callbackfunc)
|
def callbackproc(self, event): pass |
| x | イベントの発生した位置x(ウィジェットの左上を基準) |
| y | イベントの発生した位置y(ウィジェットの左上を基準) |
| x_root | イベントの発生した位置x(ディスプレイ左上を基準) |
| y_root | イベントの発生した位置y(ディスプレイ左上を基準) |
| widget | イベントを発生させたウィジェット |
| keycode | 押されたキーのASCIIコード |
| keysym | 押されたキーのX11キーシンボル文字列 |
def callbackproc(self, event): widget = event.widget widget.config(bg="yellow") |
| ■ | メニュー |
from Tkinter import *
import tkMessageBox
def j(str, encoding="japanese.shift_jis"):
return unicode(str, encoding).encode("utf8")
class App(Frame):
# 初期化処理
def init(self):
self.master.title("メニューとテキスト")
# メニューボタンに張り付けるタイプのメニュー
fm = Frame(self, relief=RAISED, bd=2)
mb1 = Menubutton(fm, text=j("ファイル"))
mb1.pack(side=LEFT, anchor=W)
menu1 = Menu(mb1)
menu1.add_command(label=j("終了"), command=self.quit)
mb1.config(menu=menu1)
fm.pack(side=TOP, anchor=W, fill=X)
# テキスト
fa = Frame(self, relief=GROOVE)
ta = self.ta = Text(fa, width=40, height=6)
scrv = Scrollbar(fa, orient=VERTICAL, command=ta.yview)
scrh = Scrollbar(fa, orient=HORIZONTAL, command=ta.xview)
ta.config(xscrollcommand=scrh.set, yscrollcommand=scrv.set)
ta.bind("<Button-3>", self.rclicked)
# gridで配置すると簡単です
ta.grid(row=1, column=1)
scrv.grid(row=1, column=2, sticky=NS)
scrh.grid(row=2, column=1, sticky=EW)
fa.pack(side=TOP, padx=4, pady=4)
# ポップアップするメニュー
self.pmenu = Menu()
self.pmenu.add_command(label=j("プロパティ"), command=self.showProperty)
def rclicked(self, event):
# イベントが発生した場所はx_root, y_rootで取得できます。
self.pmenu.tk_popup(event.x_root, event.y_root)
# ポップアップメニューの項目「プロパティ」のコールバック関数
def showProperty(self):
text = self.ta.get("0.1", END)
tkMessageBox.showinfo(message=text)
def quit(self):
self.master.destroy()
def __init__(self, master=None):
Frame.__init__(self, master); self.pack(); self.init()
if __name__ == "__main__":
app = App(); app.mainloop()
# end.
|
まず、メニューバータイプのメニューですが、
fm = Frame(self, relief=RAISED, bd=2)
mb1 = Menubutton(fm, text=j("ファイル"))
mb2 = Menubutton(fm, text=j("編集"))
mb3 = Menubutton(fm, text=j("表示"))
for e in (mb1, mb2, mb3):
e.pack(side=LEFT)
menu1 = Menu(mb1)
menu1.add_command(label=j("新規作成"), command=self.new)
menu1.add_command(label=j("開く..."), command=self.open)
menu1.add_command(label=j("上書き保存"), command=self.save)
mb1.config(menu=menu1)
|
self.pmenu = Menu()
self.pmenu.add_command(label=j("切り取り"), command=self.cut)
self.pmenu.add_command(label=j("コピー"), command=self.copy)
self.pmenu.add_command(label=j("プロパティ"), command=self.showProperty)
|
セクションのサブメニューに戻る
(first uploaded 2001/08/05 last updated 2002/03/11)