簡體   English   中英

無法順序運行函數。 蟒蛇

[英]Can't run functions in sequence. Python

因此,我正在研究Tkinter,我的目標是當用戶按下按鈕時,它會打開一個新窗口,他可以在數據庫中插入數據,然后再次填充表以顯示插入的新數據。 新窗口可以正常打開,並且確實已插入數據,但是列表沒有更新,我也不知道為什么。

按鈕代碼:

self.inserir = Button(self.container2, text="Inserir", command=lambda:self.help(tm.FazTela(bd),self.populate()))

將函數作為列表獲取並運行它們的函數代碼:

def help(*functions):
    def func(*args, **kwargs):
        return_value = None
        for function in functions:
            return_value = function(*args, **kwargs)
        return return_value
    return func

如果我在生成窗口的函數之前調用populate函數,該函數可以很好地運行,但是那不是我想要的,我想在用戶輸入數據后進行更新。

我不知道是否有幫助,但這是按下按鈕后打開的窗口的代碼:

from Tkinter import *
from database import database as db
from database import tratamentos as tr
import tkMessageBox
class TelaMenor():

def __init__(self):
    self.root = None
    self.OPTIONS = []
    self.cor1 = '#D32F2F'

def CloseWindow(self):
    self.root.destroy()
    self.root = None


def SendToTR(self,nome,valor,tipo,bd):
    try:
        tr.ProdutosRecieve(nome,valor,tipo,bd)
    except:
        tkMessageBox.showerror("Erro encontrado", "Digite valores validos!")
    finally:
        self.CloseWindow()


def FazTela(self,bd):
    if(self.root!=None):
        self.CloseWindow()
        self.FazTela()
    else:
        self.root=Tk()
        # opcoes do droplist
        self.OPTIONS = [
            "Tipo de produto",
            "Doce",
            "Salgado",
            "Massa",
            "Bebida",
            "Outro"
            ]
        #fim
        # criacao e posicao dos widgets
        info = Frame(self.root)
        info.grid(sticky=N+S+W+E)

        salto1 = Label(info, text="       ")
        salto1.grid(row=0, column=0)

        nome1 = Label(info, text="Nome:")
        nome1['font']=['bold']
        nome1.grid(row=1, column=1, sticky=W)

        nome2 = Entry(info)
        nome2["width"]=40
        nome2.grid(row=2, column=1)
        salto2 = Label(info, text="")
        salto2.grid(row=3, column=0)

        valor1 = Label(info, text="Valor:")
        valor1['font']=['bold']
        valor1.grid(row=4, column=1, sticky=W)

        valor2 = Entry(info)
        valor2["width"]=40
        valor2.grid(row=5, column=1)

        salto3 = Label(info, text="")
        salto3.grid(row=6, column=0)

        variable = StringVar(info)
        variable.set(self.OPTIONS[0])

        droplist = apply(OptionMenu, (info, variable) + tuple(self.OPTIONS))
        droplist.grid(row=7, column=1)

        salto4 = Label(info, text="")
        salto4.grid(row=8, column=0)

        pronto = Button(info, text="Pronto", bg=self.cor1, bd=3,command=lambda: self.SendToTR(nome2.get(),valor2.get(),variable.get(),bd))
        pronto['font']=['bold']
        pronto['fg']='white'
        pronto.grid(row=9, column=1)

        salto5 = Label(info, text="")
        salto5.grid(row=10, column=1)

        espaco1 = Label(info, text="       ")
        espaco1.grid(row=10, column=2)
        #fim

        # barra de "status"
        status = Label(info, text="Estado: Normal", bg="white", bd=1, relief=SUNKEN, anchor=W)
        status.grid(row= 11, column=0, sticky=S+W+E, columnspan=3)
        #fim

        # formatacao da janela
        self.root.title('Cadastro do Produto')
            #root.iconbitmap(r'c:\Python27\DLLs\icon.ico')
        self.root.resizable(width=False, height=False)
        self.root.geometry('298x276')
        self.root.protocol("WM_DELETE_WINDOW",lambda: self.CloseWindow())
        self.root.mainloop()
        #fim

抱歉,葡萄牙語中有些話。

這很好地說明了為什么除非絕對必要,否則不應該使用lambda:這使調試變得很困難。 我建議不要使用lambda,而應將按鈕綁定到正常功能。 這樣做將使插入調試代碼更加容易。

在這種情況下,您的函數正在運行以下代碼:

self.help(tm.FazTela(bd),self.populate())

這與執行此操作相同:

a = tm.FazTela(bd)
b = self.populate()
self.help(a,b)

您還存在創建多個根窗口的問題。 在tkinter中,您必須始終只有一個根窗口。 除了創建第二個Tk實例,您還需要創建一個Toplevel實例。

如果要在銷毀窗口之后執行代碼,可以使用wait_window函數,該函數在給定窗口關閉之前不會返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM