在python/tkinter上将值从子窗口传递到父窗口

在python/tkinter上将值从子窗口传递到父窗口,python,tkinter,Python,Tkinter,我一直在努力学习Python语言以获得乐趣,并决定最好通过一个项目来学习。由于我在一家啤酒厂工作,我认为创建一个简单的GUI会很酷,它会显示工厂中的所有储罐以及它持有的每种啤酒及其当前状态。如果我双击一个坦克,它会弹出一个新窗口,允许我编辑坦克信息,但我无法将来自子级的信息显示在父级窗口上(更具体地说,我想从子级的组合框中更改父级列表的项)。下面的图片基本上显示了我正在努力实现的目标: 我认为这些值可能被正确地传递到列表中,但是它们没有被更新到相应的小部件中以显示。我尝试在我的函数上调用.up

我一直在努力学习Python语言以获得乐趣,并决定最好通过一个项目来学习。由于我在一家啤酒厂工作,我认为创建一个简单的GUI会很酷,它会显示工厂中的所有储罐以及它持有的每种啤酒及其当前状态。如果我双击一个坦克,它会弹出一个新窗口,允许我编辑坦克信息,但我无法将来自子级的信息显示在父级窗口上(更具体地说,我想从子级的组合框中更改父级列表的项)。下面的图片基本上显示了我正在努力实现的目标:

我认为这些值可能被正确地传递到列表中,但是它们没有被更新到相应的小部件中以显示。我尝试在我的函数上调用
.update()
.after()
.mainloop()
,但没有任何更改。
我试着检查其他答案,但实际上我希望有一种不用上课就能解决这个问题的方法,因为我还不太了解它们。下面是我能想到的最简单的最小版本的代码:

import tkinter as tk  
from tkinter import ttk  
from PIL import Image, ImageTk  


def click_duplo_tfm(event):  # recognizes double-click on tanks and opens the specific window  
    if event.widget.extra == 'Widget TFM01':  
        abrir_janela('01', 1)  
    elif event.widget.extra == 'Widget TFM02':  
        abrir_janela('02', 2)  


def salvar_alteracoes():  
    print('THIS FUNCTION IS SUPPOSED TO PASS CHANGES TO PARENT WINDOW')  


def abrir_janela(num_tfm, ref):  # opens a new window to alter tank info  
    def manter_selecao_ceva(event):  
        global ceva_tqs  
        ceva_tqs[referencia] = opcao_ceva.get()  
        print(ceva_tqs[referencia])  

    def manter_selecao_status(event):  
        global status_tqs  
        status_tqs[referencia] = opcao_status.get()  
        print(status_tqs[referencia])  

    referencia = int(ref)  
    janela = tk.Toplevel(adega_grande)  
    janela.title('TFM-' + num_tfm)  
    janela.geometry('550x300')  
    tfm = Image.open(img_tqs[referencia])  
    tfm.thumbnail((300, 300), Image.ANTIALIAS)  
    photo_tfm = ImageTk.PhotoImage(tfm, master=janela)  
    label_tfm = tk.Label(image=photo_tfm, borderwidth=0, highlightthickness=0, master=janela)  
    label_tfm.image = photo_tfm  
    label_tfm.grid(column=1, rowspan=20, row=1)  
    qual_tfm = tk.Label(master=janela, text='TFM-' + num_tfm, font='Arial 24 bold')  
    qual_tfm.grid(column=2, row=1)  
    ceva = tk.Label(master=janela, text='Cerveja: ', font='Arial 20 bold')  
    ceva.grid(column=2, row=2, sticky='W')  
    ceva_selecionada = 'Ceva selecionada'  
    opcao_ceva = ttk.Combobox(master=janela, values=cervs_factory, state='readonly', textvariable=ceva_selecionada)  
    opcao_ceva.grid(column=3, row=2)  
    opcao_ceva.bind("<<ComboboxSelected>>", manter_selecao_ceva)  
    status = tk.Label(master=janela, text='Status: ', font='Arial 20 bold')  
    status.grid(column=2, row=3, sticky='W')  
    status_selecionado = 'Status selecionado'  
    opcao_status = ttk.Combobox(master=janela, values=('Fermentando', 'Maturando'), state='readonly', textvariable=status_selecionado)  
    opcao_status.grid(column=3, row=3)  
    opcao_status.bind("<<ComboboxSelected>>", manter_selecao_status)  
    botao_salvar_alteracoes = tk.Button(master=janela, text="Salvar alterações no TFM", command=salvar_alteracoes)  
    botao_salvar_alteracoes.grid(column=2, columnspan=2, row=4)  


# creates main window and tabs (there are 22 smaller tanks to be added later on second tab)  
gui = tk.Tk()  
gui.configure(background="white")  
gui.title("Acompanhamento de adegas")  
abas = tk.ttk.Notebook(gui)  
adega_grande = tk.Frame(abas)  
adega_pequena = tk.Frame(abas)  
abas.add(adega_grande, text='Adega Grande')  
abas.add(adega_pequena, text='Adega pequena')  
abas.grid()  

# list of all kinds of beer produced in the factory  
cervs_factory = ('VAZIO', 'Weiss', 'Vienna Lager')  

# list of images to show on the tanks  
img_tqs = ["",  
           "tq cheio Beer 1.png",    # TFM-01  
           "tq cheio Beer 2.png",       # TFM-02  
           ]              # TFM-12  

# list of which beer is currently on each tank  
ceva_tqs = ["",  
            cervs_factory[1],         # TFM-01  
            cervs_factory[2]]          # TFM-02  


# list of tank current status Fermenting/Maturing  
status_tqs = ["",  
              'Fermentando',    # TFM-01  
              'Maturando',      # TFM-02  
              ]              # TFM-12  


# ~~~~  TFM's Adega Grande  ~~~~ #  
font_titulo_tfm = 'Arial 14 bold'  # altera fonte e tamanho dos títulos dos TFM's  
font_cerv_e_status = 'Arial 12 bold'  # altera fonte e tamanho do tipo de cerveja e status dos TFM's  
tamanho_img_tqs = (250, 250)  # altera o tamanho das imagens dos TFM's, só considera o menor valor  

tfm01 = Image.open(img_tqs[1])  
tfm01.thumbnail(tamanho_img_tqs, Image.ANTIALIAS)  
photo_tfm01 = ImageTk.PhotoImage(tfm01)  
label_tfm01 = tk.Label(adega_grande, image=photo_tfm01, borderwidth=0, highlightthickness=0)  
label_tfm01.grid(column=1, row=0)  
legenda_tfm01 = tk.Label(adega_grande, text='TFM-01', font=font_titulo_tfm)  
legenda_tfm01.grid(column=1, row=1)  
ceva01 = tk.Label(adega_grande, text=ceva_tqs[1], font=font_cerv_e_status)  
ceva01.grid(column=1, row=2)  
status01 = tk.Label(adega_grande, text=status_tqs[1], font=font_cerv_e_status, fg='green')  
status01.grid(column=1, row=3)  
label_tfm01.bind('<Double-Button-1>', click_duplo_tfm)  
label_tfm01.extra = "Widget TFM01"  

tfm02 = Image.open(img_tqs[2])  
tfm02.thumbnail(tamanho_img_tqs, Image.ANTIALIAS)  
photo_tfm02 = ImageTk.PhotoImage(tfm02)  
label_tfm02 = tk.Label(adega_grande, image=photo_tfm02, borderwidth=0, highlightthickness=0)  
label_tfm02.grid(column=2, row=0)  
legenda_tfm02 = tk.Label(adega_grande, text='TFM-02', font=font_titulo_tfm)  
legenda_tfm02.grid(column=2, row=1)  
ceva02 = tk.Label(adega_grande, text=ceva_tqs[2], font=font_cerv_e_status)  
ceva02.grid(column=2, row=2)  
status02 = tk.Label(adega_grande, text=status_tqs[2], font=font_cerv_e_status, fg='blue')  
status02.grid(column=2, row=3)  
label_tfm02.bind('<Double-Button-1>', click_duplo_tfm)  
label_tfm02.extra = "Widget TFM02"  

abas.mainloop()    
将tkinter作为tk导入
从tkinter导入ttk
从PIL导入图像,ImageTk
def click_duplo_tfm(事件):#识别双击储罐并打开特定窗口
如果event.widget.extra=='widget TFM01':
abrir_janela('01',1)
elif event.widget.extra=='widget TFM02':
abrir_janela('02',2)
def salvar_alteracoes():
print('此函数应将更改传递给父窗口')
def abrir_janela(num_tfm,ref):#打开一个新窗口以更改坦克信息
def manter_selecao_ceva(活动):
全球ceva_tqs
ceva_tqs[referecia]=opcao_ceva.get()
打印(ceva_tqs[参考])
def manter_selecao_状态(事件):
全球地位
status_tqs[referencea]=opcao_status.get()
打印(状态\u tqs[参考])
referencea=int(ref)
janela=塔顶标高(阿德加大)
janela.title('TFM-'+num_TFM)
janela.geometry('550x300'))
tfm=Image.open(img\u tqs[referenceia])
tfm.thumbnail((300300),Image.ANTIALIAS)
photo_tfm=ImageTk.PhotoImage(tfm,master=janela)
label\u tfm=tk.label(图像=photo\u tfm,边框宽度=0,highlightthickness=0,master=janela)
label\u tfm.image=photo\u tfm
标签网格(列=1,行跨度=20,行=1)
qual_tfm=tk.Label(master=janela,text='tfm-'+num_tfm,font='Arial 24 bold')
质量网格(列=2,行=1)
ceva=tk.Label(master=janela,text='Cerveja:',font='Arial 20 bold')
ceva.grid(列=2,行=2,粘性=W')
ceva_selecionada=‘ceva selecionada’
opcao_ceva=ttk.Combobox(master=janela,values=cervs_factory,state='readonly',textvariable=ceva_seleconada)
opcao_ceva.网格(列=3,行=2)
opcao_ceva.bind(“,manter_selecao_ceva)
status=tk.Label(master=janela,text='status:',font='Arial 20 bold')
status.grid(列=2,行=3,sticky='W')
status_selecionado='status selecionado'
opcao_status=ttk.Combobox(master=janela,value=('FernationAndo','Maturando'),state='readonly',textvariable=status_selecionado)
opcao_status.grid(列=3,行=3)
opcao_status.bind(“,manter_selecao_status)
botao_salvar_alteracoes=tk.按钮(master=janela,text=“salvar alterações no TFM”,command=salvar_alteracoes)
botao_salvar_alteracoes.grid(列=2,列跨度=2,行=4)
#创建主窗口和选项卡(稍后在第二个选项卡上添加22个较小的储罐)
gui=tk.tk()
gui.configure(后台=“白色”)
gui.标题(“阿德加斯公司”)
abas=tk.ttk.Notebook(gui)
adega_grande=传统框架(abas)
adega_pequena=传统框架(abas)
abas.add(阿德加•格兰德,text='阿德加•格兰德')
abas.add(adega_pequena,text='adega pequena')
abas.grid()
#工厂生产的各类啤酒清单
cervs_工厂=(‘瓦齐奥’、‘维斯’、‘维也纳啤酒’)
#显示在储罐上的图像列表
img_tqs=[“”,
“tq cheio Beer 1.png”,#TFM-01
“tq cheio Beer 2.png”,#TFM-02
]#TFM-12
#每个罐中当前有哪些啤酒的列表
ceva_tqs=[“”,
CERV_工厂[1],#TFM-01
CERV_工厂[2]#TFM-02
#储罐当前状态发酵/熟化列表
状态_tqs=[“”,
“发酵糖”,TFM-01
“Maturando”,TFM-02
]#TFM-12
#TFM的阿德加大酒店
font_titulo_tfm='Arial 14 bold'#altera fonte e tamanho dos títulos dos tfm's
font_cerv_e_status='Arial 12 bold'#替代TFM的状态
tamanho_img_tqs=(250250)#tamanho作为TFM的图像,sóconsidera o menor valor
tfm01=Image.open(img_tqs[1])
tfm01.缩略图(tamanho_img_tqs,图像.反别名)
photo_tfm01=ImageTk.PhotoImage(tfm01)
label\u tfm01=tk.label(阿德加•格兰德,图片=photo\u tfm01,边框宽度=0,高亮厚度=0)
标签\u tfm01.grid(列=1,行=0)
legenda_tfm01=tk.标签(adega_grande,text='TFM-01',font=font\u titulo\u TFM)
legenda_tfm01.grid(列=1,行=1)
ceva01=tk.Label(adega_grande,text=ceva_tqs[1],font=font\u cerv\u e\u status)
ceva01.网格(列=1,行=2)
status01=tk.Label(adega_grande,text=status_tqs[1],font=font\u cerv\u e\u status,fg='green')
status01.grid(列=1,行=3)
标签\u tfm01.bind(“”,单击\u duplo\u tfm)
label\u tfm01.extra=“小部件tfm01”
tfm02=Image.open(img_tqs[2])
tfm02.缩略图(tamanho_img_tqs,图像.反别名)
photo_tfm02=ImageTk.PhotoImage(tfm02)
label_tfm02=tk.label(adega_grande,image=photo_tfm02,borderwidth=0,highlightthickness=0)
标签\u tfm02.网格(列=2,行=0)
legenda_tfm02=tk.标签(adega_grande,text='TFM-02',font=font\u titulo\u TFM)
传奇故事
import tkinter as tk
from tkinter import ttk
from itertools import cycle

root = tk.Tk()
brands = ('VAZIO', 'Weiss', 'Vienna Lager')
status = ("Fermenting","Maturing")
beer_factory = cycle(brands)
beer_status = cycle(status)
beer = []

for i in range(6):
    a = tk.Label(root,text=f"TFM-0{i+1}",width=20)
    a.grid(row=0,column=i)
    b = tk.Label(root, text=next(beer_factory))
    b.grid(row=1, column=i)
    c = tk.Label(root, text=next(beer_status))
    c.grid(row=2, column=i)
    a.bind('<Double-Button-1>', lambda e, i=i: toplevel(e,i))
    beer.append([a,b,c])

def toplevel(event, i):
    top = tk.Toplevel()
    tk.Label(top,text="Beer factory").grid(row=0,column=0)
    tk.Label(top, text="Status").grid(row=1, column=0)
    com1 = ttk.Combobox(top,values=brands,state="readonly")
    com1.set(beer[i][1]["text"])
    com1.grid(row=0,column=1)
    com2 = ttk.Combobox(top,values=status,state="readonly")
    com2.set(beer[i][2]["text"])
    com2.grid(row=1,column=1)
    def finish():
        beer[i][1].config(text=com1.get())
        beer[i][2].config(text=com2.get())
        top.destroy()
    tk.Button(top,text="Finish",command=finish).grid(row=3,column=0,columnspan=2)

root.mainloop()