2

Python を学んでいて、今週は GUI コーディングの基礎を学びました。

私が抱えている問題は、一番下のf1handler1()にあります。関連付けられたメニュー項目が最初にクリックされるまで、メニュー コマンドを待機させる方法を教えてください。現在、マウスのセカンダリクリックを実行してメニューを表示するとすぐに、メニューを選択する前に選択した項目が自動的に削除されます:((ただし、何らかの理由で終了オプションは削除されませんか?)

どうもありがとう。
(コードが読みにくい場合は申し訳ありません。これは私の最初の言語であり、現在行っているコースと多くの Web 検索からゆっくりと習得している GUI です。)

from tkinter import *

ALL = N+S+W+E

class Application(Frame):

    def __init__(self, master=None):
        #initiate the primary window.
        Frame.__init__(self, master)
        self.master.rowconfigure(0, weight=1)
        self.master.columnconfigure(0, weight=1)

        self.rowconfigure(0, weight=0)
        self.rowconfigure(1, weight=0)
        self.rowconfigure(2, weight=3)
        self.columnconfigure(0, weight=0)
        self.columnconfigure(1, weight=1)
        self.columnconfigure(2, weight=1)

        self.grid(sticky=ALL)
        self.frameset()

    def frameset(self):
        #define and setup frames with columns and rows for widgets
        #Colours added to framesets to help designing layout. delete them
        self.Frame1 = Frame(self, bg='blue')   # D
        self.Frame2 = Frame(self, bg='green')  # E
        self.Frame3 = Frame(self)              # L
        self.Frame4 = Frame(self, bg='green')  # E
        self.Frame5 = Frame(self, bg='orange') # T
        self.Frame6 = Frame(self, bg='yellow') # E colours

        self.Frame1.rowconfigure(0,weight=0)
        self.Frame2.rowconfigure(0,weight=0)
        self.Frame3.rowconfigure(0,weight=1)
        self.Frame4.rowconfigure(0,weight=1)
        self.Frame5.rowconfigure(0,weight=1)
        self.Frame6.rowconfigure(0,weight=1)

        self.Frame1.columnconfigure(0,weight=0)
        self.Frame2.columnconfigure(0,weight=0)
        self.Frame3.columnconfigure(0,weight=1)
        self.Frame4.columnconfigure(0,weight=1)
        self.Frame5.columnconfigure(0,weight=1)
        self.Frame6.columnconfigure(0,weight=1)

        self.Frame1.grid(row=0, column=0, rowspan=1, columnspan=1, sticky=ALL)
        self.Frame2.grid(row=0, column=1, columnspan=2, sticky=ALL)
        self.Frame3.grid(row=1, column=0, rowspan=2, sticky=ALL)
        self.Frame4.grid(row=1, column=1, columnspan=2, sticky=ALL)
        self.Frame5.grid(row=2, column=1, rowspan=1, columnspan=1, sticky=ALL)
        self.Frame6.grid(row=2, column=2, sticky=ALL)


        label4a = Label(self.Frame4, text='Accounts', bg='orange')
        label4b = Label(self.Frame4, text='Recent Payroll', bg='yellow')
        label4a.pack(side=LEFT)
        label4b.pack(side=RIGHT)

        self.objects()

    def objects(self):
        self.f3ListBox = Listbox(self.Frame3, selectmode='single')
        self.f3ListBox.insert(1,'Colchester 441')
        self.f3ListBox.insert(2,'Chelmsford 914')
        self.f3ListBox.insert(3,'London 123')
        self.f3ListBox.grid(sticky=ALL)
        self.f3ListBox.bind("<Button-3>", self.f1handler1)

        f5ListBox = Listbox(self.Frame5, selectmode='single')
        f5ListBox.insert(0,'Fred Asus')
        f5ListBox.insert(1,'Tom Yahoo')

        f5ListBox.grid(sticky=ALL)

        f6ListBox = Listbox(self.Frame6, selectmode='single')
        f6ListBox.insert(1,'S123456') # DELETE
        f6ListBox.grid(sticky=ALL)

        #Dropdown menu to use on the top left corner        
        var = StringVar()
        var.set('Costcode')
        dmenu1 = OptionMenu(self.Frame1,var, 'Costcode','Name')
        dmenu1.pack(side=TOP, fill=BOTH)

    def f1handler1(self,event):
        """Creates a popup menu for the alternative mouse button.
        Edit this to add more options to that popup"""
        select = self.f3ListBox.delete(ACTIVE)
        popup = Menu(self, tearoff=0)
        popup.add_command(label='Quit',command=self.quit)
        popup.add_command(label='delete',command=select) #add more of these for more options


        try:
            popup.post(event.x_root, event.y_root)
        except:
            pass


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

2 に答える 2

7

問題は、実際にはコマンドを追加する前にあります。

select = self.f3ListBox.delete(ACTIVE)

これが実行されるとすぐに、削除操作が実行され、その結果が に割り当てられselectます。次のようなことをする必要があります

select = lambda: self.f3ListBox.delete(ACTIVE)

適切なタイミングで呼び出す関数を作成しますdeleteselectその後、メニュー項目のコマンドとして渡すことができます。

于 2012-12-10T01:36:25.810 に答える
-1

tkinterでボタンコマンドを設定すると、クリックを待たずにコマンドが自動的に呼び出されることがあります。考えられる解決策は、ラムダを追加することです。

popup.add_command(label='Quit',command= lambda: self.quit)
于 2012-12-09T23:17:11.980 に答える