我很难解决这个问题。
I loop through list——>"self.houses"构建组合框。
我使用字典的键"self.heroes"作为下拉选项
中的选项最后我需要"self.houses"在选择选项之前,将列表作为默认显示在组合框中(替换空单元格)。第一个组合框是"DC",第二个组合框是"黑马",最后一个是"Marvel">
我的实际应用程序获得一个列表和字典的大列表,以便在表中进行匹配和重新集成。我的脑子都要融化了,所以如果有人能帮我的话。
import tkinter as tk
from tkinter import *
from tkinter import *
from tkinter.ttk import *
root= tk.Tk()
root.minsize(550,450)
root.maxsize(560,460)
root.title('mymyAPP')
class My_Guess(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
#keys are the options to be choosen - ITS WORKING FINE
self.heroes = {'wonder woman':'wonder woman', 'iron man': 'iron man',
'astroboy':'astroboy'}
# list self,houses is used to create comboboxes loop - ITS WORKING FINE
#HERE IS THE PROBLEM:
# How 'default' strings from 'self.houses' in empty combobox loop before choose
# one and only string in each combo
self.houses = [ 'DC', 'Dark Horse', 'Marvel']
self.select_house_hero()
def select_house_hero(self):
self.definitions = self.houses
for index, definition in enumerate(self.definitions):
self.match_hero_house = StringVar()
self.my_match = Combobox(self, values=(list(self.heroes.keys())),
justify="center",
textvariable=self.match_hero_house,
state="readonly")
self.my_match.bind('<<ComboboxSelected>>',
lambda event,
cmb=self.my_match: self.get_results_from_ComboBox(event, cmb))
self.my_match.grid(row=( 1 + index), column=0, stick='w')
def get_results_from_ComboBox(self):
pass
if __name__ == '__main__':
app = My_Guess(root)
app.grid(row=0, column=0, sticky='nsew')
root.mainloop()
这是你的代码的改进版本:
import tkinter as tk
import tkinter.ttk as ttk
class MyGuess(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.heroes = ['Wonder Woman', 'Iron Man', 'Astroboy']
self.houses = ['DC', 'Dark Horse', 'Marvel']
self.variables = []
self.select_house_hero()
def select_house_hero(self):
for index, definition in enumerate(self.houses):
match_hero_house = tk.StringVar(value=definition)
self.variables.append(match_hero_house)
my_match = ttk.Combobox(self, values=self.heroes,
justify="center",
textvariable=match_hero_house,
state="readonly")
my_match.bind('<<ComboboxSelected>>',
lambda event,
cmb=my_match: self.get_results_from_combobox(event, cmb))
my_match.grid(row=index + 1, column=0, stick='w')
def get_results_from_combobox(self, event, cmb):
pass
if __name__ == '__main__':
root = tk.Tk()
root.minsize(550, 450)
root.maxsize(560, 460)
root.title('My App')
app = MyGuess(root)
app.grid(row=0, column=0, sticky='nsew')
root.mainloop()
首先移动if __name__ == '__main__':
定义之外的所有内容,否则在导入文件时将创建另一个Tk
实例。
然后也删除所有的*
导入,要么导入你需要的,要么导入整个模块,就像这里一样(这里也使用别名)。
您似乎也没有理由将self.heroes
作为字典,因此我将其更改为列表。
重要的部分是,您需要保存对所有StringVar
的引用,否则它们将被垃圾收集,所以我创建了一个属性variables
,这是一个列表,将在select_house_hero
中使用它来附加变量。在self_house_hero
中,您不需要创建新的实例变量,让它们都是本地的,因为它们无论如何都只有最后一个值。还要将StringVar
的值设置为您想要显示为标题的值。
PEP 8还建议类名为CapitalCase
(而不是Capital_Snake_Case
或任何将被调用的名称)