1

matplotlib と tkinter を使用して、GUI ベースのプロッター用のプログラムを作成しています。いくつかのオプションのトップレベル ウィンドウを追加しました。ボタンをクリックした後、関数を実行してトップレベル ウィンドウを終了したい。それは可能ですか?


私が直面している問題は、メイン ウィンドウから呼び出す必要があるトップレベル ウィンドウを使用したことです。SO このトップレベル ウィンドウを含む関数を定義しました。複数の操作を実行できる別の関数を定義すると、トップレベル ウィンドウを認識できません。クラスの下ですべてを定義できますが、機能するかどうかはわかりません。これは、トップレベル ウィンドウを含む私のコードの一部です。

def plt_options(arg):
    global lg_var,col_var,line_type_var,marker_var

    plt_opt = Toplevel(app)

    lg_var = StringVar(None)
    lg_text = Label(plt_opt,text='Legend').grid(row=0,column=0,sticky=E)
    lg_box = Entry(plt_opt,textvar=lg_var)
    lg_box.grid(row=0,column=1,sticky=W)

    col_var = StringVar(None)
    col_var.set('blue')
    col_text = Label(plt_opt,text='Color').grid(row=1,column=0)
    col_chooser = OptionMenu(plt_opt,col_var,'blue','green','red','cyan',\
           'magneta','yellow','black','white')
    col_chooser.grid(row=1,column=1)

    line_type_var = StringVar(None)
    line_type_var.set('Solid')
    line_type_text = Label(plt_opt,text='Line type').grid(row=2,column=0)
    line_chooser = OptionMenu(plt_opt,line_type_var,'Solid','Dashed',\
                          'Dotted','Dash-Dotted','None')
    line_chooser.grid(row=2,column=1)

    marker_var = StringVar(None)
    marker_var.set('None')
    marker_text = Label(plt_opt,text='Marker').grid(row=3,column=0)
    marker_chooser = OptionMenu(plt_opt,marker_var,'Plus','Dot','Circle',\
        'Star','Pentagon','Square','Cross','Diamond','Hexagon','Triangle')
    marker_chooser.grid(row=3,column=1)    

    ok_btn = Button(plt_opt,text='OK',command=testing).grid()
4

2 に答える 2

3

ボタンはまさにこのために設計されています。通常、必要なことを行う関数またはメソッドを定義し、そのメソッドをcommandボタンの属性に割り当てます。

import Tkinter as tk
import tkMessageBox

class SampleApp(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        button = tk.Button(text="Press me!", command=self.on_button)
        button.pack()
    def on_button(self):
        tkMessageBox.showinfo(message="Good-bye!")
        self.destroy()

app = SampleApp()
app.mainloop()
于 2012-07-10T01:20:14.537 に答える
2

ボタンのcommandオプションを使用すると、ボタンが押されたときに呼び出される関数/メソッド/呼び出し可能オブジェクトを指定できます。

from Tkinter import *

def buttonClicked(event):
    do_a_thing()
    do_another_thing()
    do_a_third_thing()
    #etc

root = Tk()

myButton = Button(root, text="Do Some Things", command=buttonClicked)
myButton.pack()

root.mainloop()

メソッドを呼び出すことで、ウィンドウを終了できますdestroy

ウィンドウを作成したスコープにいない場合、コールバック関数内から最上位のウィンドウを破棄できないという別の問題があるようです。ウィンドウへの参照を保持するためだけにクラス全体を定義したくない場合は、関数定義をネストできます。

from Tkinter import *

def makeMyWindow():
    root = Tk()
    def buttonClicked():
        print "Reticulating Splines..."
        print "Done. Goodbye!"
        #we can access root since we're inside the right scope, 
        #even if this function gets passed somewhere else as a callback
        root.destroy()
    myButton = Button(root, text="Do Some Things", command=buttonClicked)
    myButton.pack()

    root.mainloop()

makeMyWindow()
于 2012-07-09T19:33:48.163 に答える