Как получить значение поля со списком

Привет всем, это мой первый пост здесь, я читал вопросы, касающиеся этой темы, но на данный момент ничего не работает, поэтому вот мой вопрос. Я создал небольшое приложение для хранения данных, касающихся моей работы. как когда-либо поле со списком не возвращает значение, используя get (), какое-либо предложение на основе кода ниже?

update_news_combo = None


news = ['Mid Day News','Evening News']
features = ['Calling Farmers','Round About Ja','You and the Law','Get the Facts','Career Talk', 'Economy and you','Arts Page',
                    'Tourism Roundup','Jeep','Jamaica Promise','House Matters','Jamaica House Weekly','Urbanscope','Sports Spotlight',
                    'Share the love','Saturday News','Sunday News','Healthline','Open Feature']
features.sort()


class MenuCommands(object):
    def about_popup(self):
        messagebox.showinfo(title = "About Feature Tracker", message = 'This app is used to track Features and news edited')
    def update_popup(self):
        messagebox.showinfo(title = "File Update", message = "%s  has been Added"%update_news_combo.get())
root = Tk()
root.title('Feature Tracking')
root.geometry('255x425')
updateframe = ttk.Frame(root,padding = (5,10))          

popup = MenuCommands()

#Update Menu Frame
updateframe = ttk.Frame(root,padding = (5,10))
ttk.Label(updateframe,text ='Select Feature to add').grid(row = 0,column = 0)
update_feature_combo = ttk.Combobox(updateframe,values=features)
update_feature_combo.bind("<<>ComboboxSelected>")
update_feature_combo.grid(row = 1,column = 0)
ttk.Button(updateframe,text ='Add').grid(row = 2, column = 0)
ttk.Label(updateframe,text ='Select News to add').grid(row = 3,column = 0)
update_news_combo = ttk.Combobox(updateframe,values=news)
update_news_combo.bind("<<>ComboboxSelected>")
update_news_combo.grid(row = 4, column = 0)
news_label = ttk.Label(updateframe,textvariable = update_news_combo.get())
news_label.grid(row = 6,column = 0)
add_news =ttk.Button(updateframe,text ='Add',command = popup.update_popup)
add_news.grid(row = 5, column = 0)







def show_view_frame():
        viewframe.grid(row = 0, column = 0)
        updateframe.grid_forget()

def show_update_frame():
        updateframe.grid(row = 0, column = 0)
        viewframe.grid_forget()


#Menu bar with menu options
menubar = Menu(root)

#Update Menu
filemenu = Menu(menubar, tearoff = 0)
filemenu.add_command(label = 'New',command =show_update_frame)
filemenu.add_command(label = 'View',command =show_view_frame)
menubar.add_cascade(label = 'Update',menu = filemenu)




root.mainloop()

` Заранее спасибо за ваши предложения и помощь.


person Andrae Palmer    schedule 27.01.2015    source источник
comment
Добро пожаловать, переполнение стека. Не могли бы вы сократить свой код до минимальной версии, демонстрирующей проблему?   -  person Adaephon    schedule 27.01.2015
comment
я сделал некоторые правки, этого достаточно или мне нужно взять больше?   -  person Andrae Palmer    schedule 27.01.2015


Ответы (2)


Я упростил ваш код и сделал рабочий пример, но вам следует немного больше изучить Python, прежде чем иметь дело со сложным графическим интерфейсом.

from tkinter import messagebox, Tk, Menu, ttk

news = ['Mid Day News', 'Evening News']
features = ['Calling Farmers', 'Round About Ja', 'You and the Law', 'Get the Facts',
            'Career Talk', 'Economy and you', 'Arts Page', 'Tourism Roundup',
            'Jeep','Jamaica Promise', 'House Matters', 'Jamaica House Weekly']
features.sort()

class CustomMenu(object):
    def __init__(self, root, values=[], combo_placement=(0, 0), button_placement=(0, 0), label_placement=(0, 0)):
        self.frame = root
        self.combobox = ttk.Combobox(self.frame, values=values)
        self.combobox.bind("<<>ComboboxSelected>")
        self.combobox.grid(row=combo_placement[0], column=combo_placement[1])
        self.label = ttk.Label(self.frame, textvariable=self.combobox.get())
        self.label.grid(row=label_placement[0], column=label_placement[1])
        self.button = ttk.Button(self.frame, text="Add", command=self.update_popup)
        self.button.grid(row=button_placement[0], column=button_placement[1])

    def update_popup(self):
        messagebox.showinfo(
            title="File update",
            message="{} has been added".format(self.combobox.get())
        )


root = Tk()
root.title('Feature Tracking')
root.geometry('255x425')

update_frame = ttk.Frame(root, padding=(5,10))
def show_update_frame():
    update_frame.grid(row=0, column=0)

#Update Menu Frame
features_frame = CustomMenu(update_frame, features, (1, 0), (3, 0), (0, 0))
news_frame = CustomMenu(update_frame, news, (4, 0), (5, 0), (6, 0))

#Menu bar with menu options
menubar = Menu(root)

#Update Menu
filemenu = Menu(menubar, tearoff = 0)
filemenu.add_command(label='New', command=show_update_frame)
menubar.add_cascade(label='Update', menu=filemenu)

root.config(menu = menubar)

root.mainloop()

Это показывает, что вам не следует использовать global, если вы можете обойтись без них. Класс, который я сделал, довольно уродлив, но, по крайней мере, каждый из «CustomMenu» может ссылаться на свое собственное поле со списком для получения выбранного значения.

person volent    schedule 27.01.2015
comment
Спасибо за вашу помощь, Volent, это сработало и решило мою проблему. Я также вижу, что вы сделали, вы создали объекты и разместили их до того, как использовали их, поэтому у вас не будет проблем с доступом к ним. - person Andrae Palmer; 27.01.2015

это фрагмент кода, который показывает вам, как использовать виджет ttk Combobox:

def foo(event):#function called when '<<ComboboxSelected>>' event is triggered
    print v.get()#how to access to combobox selected item


root = Tk()
v = StringVar()#a string variable to hold user selection
options=["option 1", "option 2", "option 3"] #available combobox options
frame = Frame(root)
frame.pack()
combo = Combobox(root,textvariable=v, values=options)
combo.bind('<<ComboboxSelected>>',foo)#binding of user selection with a custom callback
combo.current(1)#set as default "option 2"
combo.pack()
root.mainloop()

Надеюсь это поможет.

С Уважением

person Alberto    schedule 27.01.2015