代码之家  ›  专栏  ›  技术社区  ›  Rainier laan

Python-Update GUI,因此它总是使用更新的列表

  •  1
  • Rainier laan  · 技术社区  · 6 年前

    我有一个项目,我有多个“小部件”在一个框架。我将一个小部件列表传递给一个名为GUI的类,该类显示所有这些“小部件”我的框架上有一个按钮,需要从列表中删除一个小部件是的但是小部件本身并没有从框架中消失。

    所以要澄清

    GUI类有一个对象列表 [Object, Object, Object, Object] . 现在它显示了4个小部件对象当我按下delete按钮时,新列表看起来像 [Object, Object, Object] 但是GUI类中的列表仍然是 [对象,对象,对象,对象] . 我怎样才能使gui始终使用列表的最新版本?

    需要澄清的准则

    import random
    from tkinter import *
    import datetime
    
    root = Tk()
    root.configure(background="white")
    root.title("Project 2.1")
    
    Widgets = []
    
    
    class GUI:
        def __init__(self, widgets, master):
    
            self.widgets = widgets
            self.master = master
            self.master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(), master.winfo_screenheight()))
    
            for widget in range(len(widgets)):
                widgets[widget].widgetFrame.pack(side=LEFT, pady=20, padx=20, fill=Y)
    
            if len(widgets) == 0:
                NoInputLabel = Label(master, text="No modules connected, please connect a module", font='Helvetica 16 bold')
                NoInputLabel.pack(side=TOP)
    
            removeButton = Button(master, text="Remove widget", command=self.removeWidget)
            removeButton.pack()
    
            print(self.widgets)
    
        def removeWidget(self):
            self.widgets = self.widgets[:-1]
            print(self.widgets)
    
    
    
    class Widget:
        def __init__(self, master, name):
            self.master = master
            self.name = name
    
            colorArray = ["#e3e0f3", "#eebddd", "#80a3db", "#036fa0"]
    
            self.widgetFrame = Frame(master, bg="white")
            # widgetFrame.pack(side=LEFT, pady=20, padx=50)
    
            widgetTop = Frame(self.widgetFrame, bg="white")
            widgetTop.pack(side=TOP)
    
            widgetCenter = Frame(self.widgetFrame, bg="white")
            widgetCenter.pack(side=TOP)
    
            widgetBottom = Frame(self.widgetFrame, bg="white")
            widgetBottom.pack(side=TOP, fill=X)
    
            self.WidgetName = Label(widgetTop, text=name, font='Helvetica 16 bold', bg=random.choice(colorArray))
            self.WidgetName.pack(fill=X)
    
            self.temperatureSliderLabel = Label(widgetTop, text="Temperature (°C)", bg="white")
            self.temperatureSliderLabel.pack()
    
            self.temperatureSlider = Scale(widgetTop, orient=HORIZONTAL, length=250, from_=0, to=40, bg="white")
            self.temperatureSlider.pack()
    
            self.lightSliderLabel = Label(widgetTop, text="Light Intensity (%)", bg="white")
            self.lightSliderLabel.pack()
    
            self.lightSlider = Scale(widgetTop, orient=HORIZONTAL, length=250, bg="white")
            self.lightSlider.pack()
    
            self.maxRolloutPositionLabel = Label(widgetTop, text="Rolling distance (cm): ", bg="white")
            self.maxRolloutPositionLabel.pack()
    
            self.maxRolloutEntry = Entry(widgetTop, bg="white")
            self.maxRolloutEntry.pack(side=LEFT)
    
            self.submitFormButton = Button(widgetTop, text="Submit", command=self.setSensors, bg="white")
            self.submitFormButton.pack(side=LEFT)
    
            self.openSunblindButton = Button(widgetCenter, text="Open sunblind", command=self.openSunblind, state=NORMAL,
                                             bg="#28a745", fg="white")
            self.openSunblindButton.pack(side=LEFT)
    
            self.closeSunblindButton = Button(widgetCenter, text="Close sunblind", command=self.closeSunblind,
                                              state=NORMAL, bg="#dc3545", fg="white")
            self.closeSunblindButton.pack(side=LEFT)
    
            self.setSunblindStatusButton = Button(widgetCenter, text="Automatic", command=self.setSunblindStatus,
                                                  bg="#6c757d", fg="white")
            self.setSunblindStatusButton.pack(side=LEFT)
    
            self.sunblindFrame = Frame(widgetBottom, bg="white")
            self.sunblindFrame.pack(fill=X)
    
            self.sunblindStatusLabel = Label(self.sunblindFrame, text="Sunblind status:", bg="white", anchor="w")
            self.sunblindStatusLabel.pack(side=LEFT, pady=5)
            self.sunblindStatus = Label(self.sunblindFrame, text="Manual", bg="white")
            self.sunblindStatus.pack(side=RIGHT, pady=5)
    
            self.temperatureFrame = Frame(widgetBottom, bg="white")
            self.temperatureFrame.pack(fill=X)
    
            self.temperatureValueLabel = Label(self.temperatureFrame, text="Temperature: ", justify=LEFT, bg="white",
                                               anchor="w")
            self.temperatureValueLabel.pack(side=LEFT, pady=5)
            self.temperatureValue = Label(self.temperatureFrame, text="", bg="white")
            self.temperatureValue.pack(side=RIGHT, pady=5)
    
            self.lightSliderFrame = Frame(widgetBottom, bg="white")
            self.lightSliderFrame.pack(fill=X)
    
            self.lightSliderValueLabel = Label(self.lightSliderFrame, text="Light Intensity: ", justify=LEFT, bg="white",
                                               anchor="w")
            self.lightSliderValueLabel.pack(side=LEFT, pady=5)
            self.lightSliderValue = Label(self.lightSliderFrame, text="", bg="white")
            self.lightSliderValue.pack(side=RIGHT, pady=5)
    
            self.rolloutFrame = Frame(widgetBottom, bg="white")
            self.rolloutFrame.pack(fill=X)
    
            self.rolloutLabel = Label(self.rolloutFrame, text="Roll-out position: ", justify=LEFT, bg="white", anchor="w")
            self.rolloutLabel.pack(side=LEFT, pady=5)
            self.rolloutValue = Label(self.rolloutFrame, text="", bg="white")
            self.rolloutValue.pack(side=RIGHT, pady=5)
    
            self.variable = StringVar(widgetBottom)
            self.variable.set(self.name)
            self.chooseArduino = OptionMenu(widgetBottom, self.variable, "Living Room", "Bedroom", "Study", "Sex Dungeon",
                                            "Bingo club")
            self.chooseArduino.pack()
    
            self.setNameButton = Button(widgetBottom, text="Set name", command=self.setArduinoName)
            self.setNameButton.pack()
    
        def setSensors(self):
            print("Set the temperature and light of the sensors")
            self.temperatureValue.config(text=str(self.temperatureSlider.get()) + "°C")
            self.temperature = self.temperatureSlider.get()
            self.lightSliderValue.config(text=str(self.lightSlider.get()))
            self.lightIntensity = self.lightSlider.get()
            self.maxRolloutPositionLabel.config(text="Rolling distance (cm): " + str(self.maxRolloutEntry.get()))
    
        def setName(self, widgetName):
            self.widgetName = widgetName
    
        def openSunblind(self):
            print("Set the sunblind to an open state")
            self.rolloutValue.config(text="Rolled out")
    
        def closeSunblind(self):
            print("Set the sunblind to an closed state")
            self.rolloutValue.config(text="Rolled in")
    
        def setSunblindStatus(self):
            if self.setSunblindStatusButton.config('text')[-1] == 'Automatic':
                self.openSunblindButton.config(state=DISABLED)
                self.closeSunblindButton.config(state=DISABLED)
                self.setSunblindStatusButton.config(text='Manual')
                print("Sunblind is set to: " + self.setSunblindStatusButton['text'])
                self.sunblindStatus.config(text="Automatic")
            else:
                self.openSunblindButton.config(state=NORMAL)
                self.closeSunblindButton.config(state=NORMAL)
                self.setSunblindStatusButton.config(text='Automatic')
                print("Sunblind is set to: " + self.setSunblindStatusButton['text'])
                self.sunblindStatus.config(text="Manual")
    
    
        def setArduinoName(self):
            self.WidgetName.config(text=self.variable.get())
    
    
        def getTemperature(self):
            return self.temperature
    
        def getLightIntensity(self):
            return self.lightIntensity
    
    
    Arduino1 = Widget(root, "Arduino 1")
    Arduino2 = Widget(root, "Arduino 2")
    Arduino3 = Widget(root, "Arduino 3")
    Arduino4 = Widget(root, "Arduino 4")
    Arduino5 = Widget(root, "Arduino 5")
    Widgets.append(Arduino1)
    Widgets.append(Arduino2)
    Widgets.append(Arduino3)
    Widgets.append(Arduino4)
    Widgets.append(Arduino5)
    Visueel = GUI(Widgets, root)
    
    root.mainloop()
    

    图像

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  2
  •   Heike    6 年前

    你可以试试

    def removeWidget(self):
        widget = self.widgets.pop()
        widget.widgetFrame.pack_forget()
        print(self.widgets)