2

みなさん、こんにちは。よろしくお願いします!

私はグーグル全体を検索し、得たほとんどすべての結果を読みましたが、まだ理解できない
ので、少なくとも何らかの方向性を教えてください!
pmw について読みましたが、最初に tkinter でそれを行う方法があるかどうかを確認したいと思います。

私は DnD サイコロを振るための十分に単純なプログラムを書いてい
ます。誰かがプレイする必要があるいくつかのサイコロを含む OptionMenu があります。
デフォルトのオプションに含まれていないサイコロを入力するための入力フィールドもあります。私の問題は、新しい
オプションが正常に追加されても、オプションがソートされないことです。

ある時点で、新しいオプションが追加されたときに OptionMenu を破棄し
、リストを並べ替えてから OptionMenu を最初から再構築することで解決しましたが、当時は
プレース マネージャー メソッドを使用していたため、後でプログラムを書き直さなければなりませんでした。
いくつかの解像度の問題。現在、パック マネージャーを使用しています
が、すべてのウィジェットを「再」パックするか、ウィジェット専用のラベルを作成したい場合を除き、破棄/再構築はオプションではありません。

これが私のコードの実際のサンプルです:

from tkinter import *

class DropdownExample(Frame):
    def __init__(self, master = None):
        Frame.__init__(self, master)
        self.pack(fill = 'both', expand = True)

        # Add Option Button
        self.addOptBtn = Button(self, text = "Add Option", command = self.add_option)

        # Option Input Field
        self.newOpt = IntVar()
        self.newOpt.set("Type a number")

        self.optIn = Entry(self)
        self.optIn['textvariable'] = self.newOpt

        # Dropdown Menu
        self.myOptions = [0, 1, 2]

        self.selOpt = IntVar()
        self.selOpt.set("Options")

        self.optMenu = OptionMenu(self, self.selOpt, *self.myOptions)

        # Positioning
        self.addOptBtn.pack(side = 'left', padx = 5)
        self.optIn.pack(side = 'left', padx = 5)
        self.optMenu.pack(side = 'left', padx = 5)


    def add_option(self):
        self.numToAdd = ""
        self.counter = 0

        try:
            self.numToAdd = int(self.optIn.get())                                           # Integer validation

            while self.counter < len(self.myOptions):                                       # Comparison loop & error handling
                if self.numToAdd == self.myOptions[self.counter]:
                    print("Already exists!")                    
                    break;

                elif self.numToAdd < 0:
                    print("No less than 0!")
                    break;

                elif self.counter < len(self.myOptions)-1:
                    self.counter += 1

                else:                                                                       # Dropdown menu option addition
                    self.myOptions.append(self.numToAdd)
                    self.myOptions.sort()

                    self.optMenu['menu'].add_command(label = self.numToAdd)

                    self.selOpt.set(self.numToAdd)

                    print("Added succesfully!")

                    self.counter += 2

        except ValueError:
            print("Type ONLY numbers!")


def runme():
    app = DropdownExample()
    app.master.title("Dropdown Menu Example")
    app.master.resizable(0, 0)
    app.mainloop()

runme()

Windows 7でPython 3.3を使用しています

4

3 に答える 3

1

には一連のinsert_something() メソッドがありMenuます。挿入ごとにリストをソートしておく必要があります ( bisectモジュール)。

from tkinter import *
import bisect

...
                else:                                                                       # Dropdown menu option addition
                    index = bisect.bisect(self.myOptions, self.numToAdd)
                    self.myOptions.insert(index, self.numToAdd)
                    self.optMenu['menu'].insert_command(index, label=self.numToAdd)
                    self.selOpt.set(self.numToAdd)
                    print("Added succesfully!", self.myOptions)
                    self.counter += 2
于 2013-05-10T05:43:55.223 に答える
0

次の行を置き換えます。

self.optMenu['menu'].add_command(label = self.numToAdd)

と:

for dit in self.myOptions:
    self.optMenu['menu'].delete(0)
for dat in self.myOptions:
    self.optMenu['menu'].add_command(label = dat)

問題は、「add_command」がメニューに追加する項目を取得し、「delete」が項目のインデックスを取得することです。

于 2013-05-10T21:25:57.950 に答える