如何使tkinter组合框循环工作在类使用列表默认和1字典下拉菜单?



我很难解决这个问题。

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或任何将被调用的名称)

相关内容

  • 没有找到相关文章

最新更新