Python: установите флажок - самый простой способ
или, возможно, ленивый способ.
Я ищу модуль python, который имеет встроенные GUI-методы для быстрого ввода данных пользователя - очень распространенный случай программирования. Должен работать над окнами 7
Мой идеальный случай
import magicGUImodule
listOfOptions = ["option 1", "option 2", "option 3"]
choosenOptions = magicGUImodule.getChecklist(listOfOptions,
selectMultiple=True, cancelButton=True)
Это похоже на raw_input
, но с графическим интерфейсом. Там должно быть что-то, потому что это общая задача программирования.
UPDATE
@alecxe не должно быть грубым, что я не проверял ваш ответ как решение моей проблемы. Я все еще хочу использовать мой идеальный случай в любом script, над которым я работаю, и ваш ответ получает меня наполовину.
Я думал, что могу легко реализовать решение @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
И вот мой script
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 дал мне именно то решение, которое я искал.
Ответы
Ответ 1
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
для одного выбора.
Ответ 2
Здесь используется простой пример с использованием Tkinter
(вместо флажков listbox
с множественным выбором):
from Tkinter import *
def callback():
print listbox.selection_get()
master.destroy()
master = Tk()
listbox = Listbox(master, selectmode=MULTIPLE)
for option in ["option 1", "option 2", "option 3"]:
listbox.insert(0, option)
listbox.pack()
b = Button(master, command=callback, text="Submit")
b.pack()
mainloop()
UPDATE:
GetUserInput.py
:
from Tkinter import *
class GetUserInput(object):
selection = None
def __init__(self, options, multiple):
self.master = Tk()
self.master.title("Choose from list")
self.listbox = Listbox(self.master, selectmode=MULTIPLE if multiple else SINGLE, width=150, height=30)
for option in options:
self.listbox.insert(0, option)
self.listbox.pack()
b = Button(self.master, command=self.callback, text="Submit")
b.pack()
self.master.mainloop()
def callback(self):
self.selection = self.listbox.selection_get()
self.master.destroy()
def getInput(self):
return self.selection
main script:
from GetUserInput import GetUserInput
listOfOptions = ["option 1", "option 2", "option 3"]
print GetUserInput(listOfOptions, True).getInput()
Надеюсь, что это поможет.
Ответ 3
Я повторил ответ @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
Родительский script
#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, поэтому некоторые значения должны были быть скорректированы (ex MULTIPLE → 'multiple')
Ответ 4
Listbox
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
Checkbutton + Radiobutton
Используйте кнопку Checkbutton для нескольких параметров, Radiobutton для одной опции.
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()]
Ответ 5
Ну, вы не получите что-то довольно быстрое, почти независимо от того, где вы смотрите, я не думаю. Как правило, для создания окна верхнего уровня и/или виджета вам потребуется, по крайней мере, достаточно шаблона, чтобы компоновать входные виджеты, которые вам действительно нужны.
Python имеет отличные привязки для GTK2 и Qt (PyQt, теперь использует 4.X), и очень качественные кросс-платформенные графические инструменты, с которыми легко начать работу. Есть и другие, wxWidgets - еще один видный, но остальные (включая встроенный IMO) довольно устарели.
Ответ 6
Tkinter встроен в Python, имеет флажки в значительной степени в том виде, в котором вы указываете выше, и гораздо более прост, чем большинство других графических модулей. Пожалуйста, найдите хороший учебник (хотя вам нужно немного освежить) здесь. Официальные документы здесь.
Ответ 7
Отсюда вы можете получить точный ответ. Просто нажмите здесь http://www.blog.pythonlibrary.org/2013/02/27/wxpython-adding-checkboxes-to-objectlistview/