Python.use(better, Tkinter=”GoF”) # Command

記事一覧

Python.use(better, Tkinter=”GoF")《余録》
Command《Python3.1》
-- pay a tribute to "C# Design Patterns" by James William Cooper

《著》小粒ちゃん+∞《監修》小泉ひよ子とタマゴ倶楽部
α版♪1993/11/25 ● β版♪1995/11/22 ● 第1版♪2006/10/28

概要

Tkinter アプリケーションとして、Python で実現した事例を紹介します。

Tkinter によるオブジェクト指向プログラミングへの扉を開きます。
※ Tcl/Tk で作成した例題を、Tkinter で再構成しました。

〓 事例

次のコードを実行すると、ウィンドウが現われます。

>>> FullCommand()



## ----------------------------------------
from tkinter import *
from tkinter.filedialog import FileDialog

## ----------------------------------------
class TIPS(object):
    def __init__(self, master, canvas):
        self.value = StringVar()
        self.master = master
        self.canvas = canvas
        self.create_widget(master)
        self.create_menubutton(master)

    def create_widget(self, master):
        widget = CommandButton(
            master=master,
            value=self.value,
            command=self.redCommand,
            )
        widget.pack(side=RIGHT)
        self.value.set("Red")

    def create_menubutton(self, master):
        widget = Menubutton(
            master=master,
            text='File',
            )
        widget.pack(side=TOP)

        menu = Menu(widget)
        widget['menu'] = menu

        for text, command in [
            ("Open...", self.fileCommand),
            ("Exit"   , self.exitCommand),
        ]:
            CommandMenu(
                menu=menu,
                text=text,
                command=command,
                )

    def redCommand(self):
        bg = self.value.get()
        self.canvas.config(bg=bg)

    def fileCommand(self):
        """
    $ /Users/sketch/Downloads/Python-3.0/Lib/tkinter/filedialog.py 
    class FileDialog:
        d = FileDialog(master)
        fname = d.go(dir_or_file, pattern, default, key)
        if fname is None: ...canceled...
        else: ...open file...
        """
        d = FileDialog(self.master)
        fname = d.go("/usr/local/bin")
        print("<<<", fname)

    def exitCommand(self):
        self.master.destroy()

## ----------------------------------------
class CommandHolder(object):
    pass

class CommandButton(Button, CommandHolder):
    def __init__(self, master, value, command):
        Button.__init__(
            self,
            master=master,
            textvariable=value,
            command=command,
            )

class CommandMenu(CommandHolder):
    def __init__(self, menu, text, command):
        menu.add_radiobutton(
            label=text,
            value=text,
            command=command,
            )

## ----------------------------------------
def FullCommand():
    root = Tk()
    root.title("FullCommand")
    root.config(padx=8, pady=4)

    canvas = Canvas(
        root,
        width=100, height=100, relief=RIDGE, borderwidth=5,
        )
    frame = Frame(root)

    TIPS(root, canvas)    

    canvas.pack()
    frame .pack()
    root.mainloop()

## ----------------------------------------
## ----------------------------------------
## ----------------------------------------
## ----------------------------------------
## ----------------------------------------

from tkinter import *
from tkinter.filedialog import FileDialog

## ----------------------------------------
class TIPS(object):
    def __init__(self, master, canvas):
        self.value = StringVar()
        self.master = master
        self.canvas = canvas
        self.create_CommandButton(master)
        self.create_Menubutton(master)

    def create_CommandButton(self, master):
        frame = Frame(master)
        frame.pack(side=RIGHT)
        
        s = "aliceblue", "beige", "lavender",
        for e in s:
            widget = CommandButton(
                master=frame,
                text=e,
                variable=self.value,
                command=self.buttonCommand,
                )
            widget.pack(anchor=W)

    def create_Menubutton(self, master):
        widget = Menubutton(
            master=master,
            text='File',
            )
        widget.pack(side=TOP)

        menu = Menu(widget)
        widget['menu'] = menu

        for text, command in [
            ("Open...", self.fileCommand),
            ("Exit"   , self.exitCommand),
        ]:
            CommandMenu(
                menu=menu,
                text=text,
                command=command,
                )

    def buttonCommand(self):
        bg = self.value.get()
        self.canvas.config(bg=bg)

    def fileCommand(self):
        dir_or_file = "./_flags"
        s = FileDialog(self.master).go(dir_or_file)
        self.image = PhotoImage(file=s)

        s    = s.split("/")[-1]
        text = s.split(".")[0]

        dx = self.master["padx"]
        dx = int(str(dx))
        x, y, dy = 50+dx, 80, 8

        self.canvas.create_image(
            x, y   , anchor=S, image=self.image)
        self.canvas.create_text(
            x, y+dy, anchor=N, text=text)

    def exitCommand(self):
        self.master.destroy()

## ----------------------------------------
class CommandHolder(object):
    pass

class CommandButton(CommandHolder, Radiobutton):
    def __init__(self, master, text, variable, command):
        super().__init__(
            master=master,
            text=text,
            value=text,
            variable=variable,
            command=command,
            )

class CommandMenu(CommandHolder):
    def __init__(self, menu, text, command):
        menu.add_radiobutton(
            label=text,
            command=command,
            )

## ----------------------------------------
def command():
    root = Tk()
    root.title("Command")
    root.config(padx=8, pady=4)

    canvas = Canvas(
        root,
        width=100, height=100, relief=RIDGE, borderwidth=5,
        )

    TIPS(root, canvas)    

    canvas.pack()
    root.mainloop()

〓 関連記事

Last updated♪2009/08/25