10

またはおそらく怠惰な方法..

非常に一般的なプログラミングのケースである、ユーザー入力をすばやく取得するための GUI メソッドが組み込まれている Python モジュールを探しています。Windows 7で動作する必要があります

私の理想のケース

import magicGUImodule
listOfOptions = ["option 1", "option 2", "option 3"]
choosenOptions = magicGUImodule.getChecklist(listOfOptions, 
                            selectMultiple=True, cancelButton=True)

ちょっと似raw_inputていますが、GUIがあります。これは一般的なプログラミング タスクであるため、そこには何かがあるに違いありません。


アップデート

@alecxe私の問題の解決策としてあなたの答えのチェックを外したのは失礼ではありません。私が取り組んでいるどんなスクリプトでも理想的なケースを使用できるようにしたいのですが、あなたの答えは私を半分にしてくれます。

@alecxeのソリューションをモジュールに簡単に実装できると思いましたが、それほど単純ではありません(私にとっては)..

これまでの私のモジュールは次のとおりです。

# This serve as a module to get user input - the easy way!
# Some GUI selection
#from Tkinter import *
import Tkinter

master = Tkinter.Tk()
input = None
listbox = None

def chooseFromList(list, windowTitle="Choose from list", buttonText="Submit", selectMultiple=False, w=150, h=30):
    global listbox
    listbox = Tkinter.Listbox(master, selectmode=MULTIPLE if selectMultiple else SINGLE, width=w, height=h)
    listbox.master.title(windowTitle)
    for option in list:
        listbox.insert(0, option)
    listbox.pack()
    #listbox.selection_set(1)
    b = Tkinter.Button(master, command=callback(listbox), text=buttonText)
    b.pack()
    mainloop()

def callback(listbox):
    global listbox
    setInput(listbox.selection_get())
    master.destroy()    

def setInput(var):
    global input
    input = var

def getInput():
    global input
    return input

そして、ここに私のスクリプトがあります

import GetUserInput
listOfOptions = ["option 1", "option 2", "option 3"]
choice = GetUserInput.chooseFromList(listOfOptions)
print choice.getInput()

しかし、私はちょうどエラーが発生します

can't invoke "listbox" command: application has been destroyed

ケースを解決するさまざまなオプションを試しましたが(グローバル変数を使用するなど)、運がありませんでした。

更新 2

@blablatros は、まさに私が探していたソリューションを提供してくれました。

4

7 に答える 7

13

Easyguiモジュールはまさにあなたが必要としているものです:

import easygui as eg

question = "This is your question"
title = "This is your window title"
listOfOptions = ["option 1", "option 2", "option 3"]

choice = eg.multchoicebox(question , title, listOfOptions)

choice選択した回答のリストを返します。

multchoicebox多肢選択問題、または単一選択問題に使用しchoiceboxます。

于 2013-06-26T20:46:18.433 に答える
4

OOPを使用してGUIの寿命をより堅牢な方法で管理し、@alecxeの回答を繰り返しました。

GUI 要素

# This serve as a module to get user input - the easy way!
# Some GUI selection
import Tkinter

default_kwargs = { 
                  'selectmode'  : "single"          ,
                  'width'       : "150"             ,
                  'height'      : "30"              ,
                  'title'       : "Choose from list",
                  'buttonText'  : "Submit"  
}



class easyListBox:

    def __init__(self, options_list, **kwargs) :

        #options
        opt = default_kwargs #default options
        opt.update(kwargs) #overrides default if existant

        #Return value
        self.selected = 0;

        # GUI master object (life-time component)
        self.master = Tkinter.Tk()

        # Checklist with options
        listbox_options = { key: opt[key] for key in opt if key in['selectmode','width','height'] } #options slice for GUI
        self.listbox = Tkinter.Listbox(self.master, listbox_options)
        self.listbox.master.title(opt['title'])

        #Options to be checked
        for option in options_list:
            self.listbox.insert(0,option)
        self.listbox.pack()

        # Submit callback
        self.OKbutton = Tkinter.Button(self.master, command=self.OKaction, text=opt['buttonText'] )
        self.OKbutton.pack()

        #Main loop
        self.master.mainloop()

    # Action to be done when the user press submit
    def OKaction(self):
        self.selected =  self.listbox.selection_get()
        self.master.destroy() 

    # Return the selection
    def getInput(self):
        return self.selected

親スクリプト

#import GetUserInput
import GUI as GetUserInput

listOfOptions = ["option 1", "option 2", "option 3"]
GUI_options = {'title' : "Custom title", 'selectmode' : 'multiple' }
#choice = GetUserInput.chooseFromList(listOfOptions)
elb = GetUserInput.easyListBox(listOfOptions, **GUI_options)
print elb.getInput()

変数パラメーターを処理するために、いくつかのデフォルト パラメーター kwargs を追加しました。

PS : Python 2.7 を使用しているため、一部の値を調整する必要がありました (例: MULTIPLE -> 'multiple')。

于 2013-06-24T08:29:25.203 に答える
3

リストボックス

import Tkinter

def callback(master, listbox, selection):
    selection[:] = [listbox.get(i) for i in map(int, listbox.curselection())]
    master.destroy()

def chooseFromList(options, windowTitle="Choose from list", buttonText="Submit", selectMultiple=False, w=150, h=30):
    master = Tkinter.Tk()
    master.title(windowTitle)
    listbox = Tkinter.Listbox(master, selectmode=Tkinter.MULTIPLE if selectMultiple else Tkinter.SINGLE, width=w, height=h)
    for option in options:
        listbox.insert(Tkinter.END, option)
    listbox.pack()
    selection = []
    Tkinter.Button(master, command=lambda: callback(master, listbox, selection), text=buttonText).pack()
    master.mainloop()
    return selection

チェックボタン + ラジオボタン

複数のオプションにはチェックボタンを使用し、単一のオプションにはラジオボタンを使用します。

def chooseFromList(options, windowTitle="Choose from list", buttonText="Submit", selectMultiple=False, w=150, h=30):
    master = Tkinter.Tk()
    master.title(windowTitle)

    variables = []
    if selectMultiple:
        for option in options:
            v = Tkinter.StringVar()
            variables.append(v)
            Tkinter.Checkbutton(text=option, variable=v, onvalue=option, offvalue='').pack()
    else:
        v = Tkinter.StringVar()
        variables.append(v)
        for option in options:
            Tkinter.Radiobutton(text=option, variable=v, value=option).pack()

    Tkinter.Button(master, command=master.destroy, text=buttonText).pack()
    master.mainloop()
    return [v.get() for v in variables if v.get()]
于 2013-06-24T08:23:37.960 に答える
1

まあ、どこを見ても、それほど早く何かを手に入れることはできないと思います。通常、トップレベルのウィンドウやウィジェットを作成して、実際に関心のある入力ウィジェットをレイアウトするのに十分なボイラープレートが少なくとも必要です。

Python には、GTK2 と Qt (PyQt、今のところ 4.X を使用) の両方に対する優れたバインディングがあり、どちらも簡単に使い始めることができる非常に高品質のクロスプラットフォーム GUI ツールキットです。他にも wxWidgets がありますが、それ以外 (組み込みの IMO を含む) はかなり時代遅れです。

于 2013-06-19T08:07:20.187 に答える
1

Tkinterは Python 内に構築されており、上記の形式のチェックボックスがほとんどあり、他のほとんどの GUI モジュールよりもはるかに簡単です。ここで良いチュートリアルを見つけてください(ただし、更新が必要です)。公式ドキュメントはこちらです。

于 2013-06-19T08:26:44.853 に答える