Python - 检查正在使用哪个子类

标签 python python-3.x tkinter

我正在制作一个 Python Tkinter GUI,其中我有两个类,它们称为 temperatureWidgetlightWidget,它们都扩展了它们的父类 Widget。在父类中,我有一个条目和一个链接到名为 setSensors() 的函数的按钮。在这个函数中,我想检查正在使用哪个子类。例如,如果子类是 temperatureWidget,则读取名为“temperatureSlider”的刻度输入,并将其值放入名为“Temperature label”的标签中。这可能非常模糊,但代码会澄清

import random
# from random import *
from tkinter import *
import threading
from queue import *
import datetime

import matplotlib as matplotlib

root = Tk()
root.configure(background="white")
root.title("Project 2.1")


class SerialThread(threading.Thread):
    def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue


class GUI:
    def __init__(self, master):
        # Random most secnificant bit tussen 0 en 1
        self.msb = random.randint(0, 1)
        # Lijst met widgets
        self.widgets = []
        # De root
        self.master = master
        # Zet het scherm volledige scherm
        self.master.geometry("{0}x{1}+0+0".format(master.winfo_screenwidth(), master.winfo_screenheight()))

        # Maak een nieuwe frame aan
        self.widgetFrame = Frame(master, bg="white")
        # En zet deze frame boven aan de pagina
        self.widgetFrame.pack(side=TOP)

        # Maak een nieuwe frame aan en zet deze in de widgetFrame
        self.widgetTop = Frame(self.widgetFrame, bg="white")
        # Zet deze frame bovenaan in de widgetframe
        self.widgetTop.pack(side=TOP, fill=X)

        #
        self.removeText = Entry(self.widgetTop)
        self.removeText.pack()
        removeButton = Button(self.widgetTop, text="Remove widget ", command=self.removeWidget)
        removeButton.pack()

        addButton = Button(self.widgetTop, text="Add widget", command=self.addWidgetToScreen)
        addButton.pack()

    def showGui(self):
        # Als de lengte van de lijst met widgets groter is dan 0
        if len(self.widgets):
            # Voor alle widgets in de lijst met widgets
            for widget in range(len(self.widgets)):
                # Stop de widget in de mainframe
                self.widgets[widget].mainFrame.pack(side=LEFT, pady=20, padx=20, fill=Y)
        # Anders
        else:
            # Laat deze label zien
            NoInputLabel = Label(self.widgetTop, text="No modules connected, please connect a module",
                                 font='Helvetica 16 bold', bg='white', anchor='center')
            NoInputLabel.pack(side=TOP, pady=50, padx=20)

    def addWidget(self, widget):
        # Voeg de widget toe aan de lijst met widgets
        self.widgets.append(widget)

    def removeWidget(self):
        # Voor alle widgets in de lijst met widgets
        for index, widget in enumerate(self.widgets):
            # Als de naam van de widget gelijk is aan de ingevulde naam
            if widget.name == self.removeText.get():
                # Verwijder dan die widget uit de mainframe
                self.widgets[index].mainFrame.pack_forget()
                # Em verwijder hem uit de lijst
                del self.widgets[index]

    def addWidgetToScreen(self):
        # Als de lengte van de widget groter is dan 0
        num = random.randint(0, 1)
        if len(self.widgets):

            if num == 0:
                # En maak een nieuwe widget aan met als nummer één hoger dan de laatste
                newWidget = temperatureWidget(self.master, "COM" + str(len(self.widgets) + 1), self)
            else:
                newWidget = lightWidget(self.master, "COM" + str(len(self.widgets) + 1), self)
        else:
            # Maak een widget aan met nummer 1
            if num == 0:
                # En maak een nieuwe widget aan met als nummer één hoger dan de laatste
                newWidget = temperatureWidget(self.master, "COM1", self)
            else:
                newWidget = lightWidget(self.master, "COM1", self)

        # Voeg hem dan toe aan de lijst met widgets
        self.widgets.append(newWidget)
        # Pak de widget in de mainframe
        self.widgets[-1].mainFrame.pack(side=LEFT, pady=20, padx=20, fill=Y)


class Widget:
    def __init__(self, master, name, gui):
        self.msb = 0
        self.master = master
        self.name = name
        self.gui = gui

        # Set de main frame van een widget
        self.mainFrame = Frame(gui.widgetFrame, bg='white')

        # Maak een frame die de top van de mainframe hanteerd
        self.mainFrameTop = Frame(self.mainFrame, bg='white')
        self.mainFrameTop.pack(side=TOP)
        # Maak een die onder de top frame komt en daarom center is
        self.mainFrameCenter = Frame(self.mainFrame, bg='white')
        self.mainFrameCenter.pack(side=TOP)
        # Maak een die daar weer onder komt en dus onderstaan zit
        self.mainFrameBottom = Frame(self.mainFrame, bg='white')
        self.mainFrameBottom.pack(side=TOP)

        colorArray = list(matplotlib.colors.cnames.values())

        self.WidgetName = Label(self.mainFrameTop, text=name, font='Helvetica 16 bold', bg=random.choice(colorArray))
        self.WidgetName.pack(fill=X)

        self.msb = random.randint(0, 1)

        self.maxRolloutPositionLabel = Label(self.mainFrameTop, text="Rolling distance (cm): ", bg="white")
        self.maxRolloutPositionLabel.pack()

        self.maxRolloutEntry = Entry(self.mainFrameTop, bg="white")
        self.maxRolloutEntry.pack()

        self.submitFormButton = Button(self.mainFrameTop, text="Submit", command=self.setSensors, bg="white")
        self.submitFormButton.pack()

        '''
            Sunblind status functions and GUI elements
        '''
        self.openSunblindButton = Button(self.mainFrameCenter, text="Open sunblind", command=self.openSunblind,
                                         state=NORMAL,
                                         bg="#28a745", fg="white")
        self.openSunblindButton.pack(side=LEFT)

        self.closeSunblindButton = Button(self.mainFrameCenter, text="Close sunblind", command=self.closeSunblind,
                                          state=NORMAL, bg="#dc3545", fg="white")
        self.closeSunblindButton.pack(side=LEFT)

        self.setSunblindStatusButton = Button(self.mainFrameCenter, text="Automatic", command=self.setSunblindStatus,
                                              bg="#6c757d", fg="white")
        self.setSunblindStatusButton.pack(side=LEFT)

        self.sunblindFrame = Frame(self.mainFrameBottom, 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.rolloutFrame = Frame(self.mainFrameBottom, 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(self.mainFrameBottom)
        self.variable.set(self.name)
        self.chooseArduino = OptionMenu(self.mainFrameBottom, self.variable, "Living Room", "Bedroom", "Study")
        self.chooseArduino.pack(side=LEFT)

        self.setNameButton = Button(self.mainFrameBottom, text="Set name", command=self.setArduinoName)
        self.setNameButton.pack(side=LEFT)

    def setSensors(self):
        print("Set the temperature and light of the sensors")
        # Check which subclass is used
        self.maxRolloutPositionLabel.config(text="Rolling distance (cm): " + str(self.maxRolloutEntry.get()))


    def setName(self, widgetName):
        self.name = 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")
            self.rolloutValue.config(text='')
        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


class temperatureWidget(Widget):
    def __init__(self, master, name, gui):
        super().__init__(master, name, gui)

        self.temperatureSliderLabel = Label(self.mainFrameTop, text="Temperature (°C)", bg="white")
        self.temperatureSlider = Scale(self.mainFrameTop, orient=HORIZONTAL, length=250, from_=0, to=40, bg="white")
        self.temperatureSliderLabel.pack()
        self.temperatureSlider.pack()

        self.temperatureFrame = Frame(self.mainFrameBottom, bg="white")
        self.temperatureFrame.pack(fill=X)

        self.temperatureValueLabel = Label(self.temperatureFrame, text="Temperature: ", justify=LEFT, bg="white",
                                           anchor="w")
        self.temperatureValue = Label(self.temperatureFrame, text="", bg="white")

        self.temperatureValueLabel.pack(side=LEFT, pady=5)
        self.temperatureValue.pack(side=RIGHT, pady=5)


class lightWidget(Widget):
    def __init__(self, master, name, gui):
        super().__init__(master, name, gui)

        self.lightSliderLabel = Label(self.mainFrameTop, text="Light Intensity (%)", bg="white")
        self.lightSlider = Scale(self.mainFrameTop, orient=HORIZONTAL, length=250, bg="white")
        self.lightSliderLabel.pack()
        self.lightSlider.pack()

        self.lightSliderFrame = Frame(self.mainFrameBottom, bg="white")
        self.lightSliderFrame.pack(fill=X)

        self.lightSliderValueLabel = Label(self.lightSliderFrame, text="Light Intensity: ", justify=LEFT,
                                           bg="white",
                                           anchor="w")
        self.lightSliderValue = Label(self.lightSliderFrame, text="", bg="white")
        self.lightSliderValueLabel.pack(side=LEFT, pady=5, fill=X)
        self.lightSliderValue.pack(side=RIGHT, pady=5)


Visueel = GUI(root)
Arduino1 = lightWidget(root, "COM1", Visueel)
Arduino2 = temperatureWidget(root, "COMT", Visueel)
Arduino3 = lightWidget(root, "COML", Visueel)
Arduino4 = temperatureWidget(root, "COM4", Visueel)
Arduino5 = lightWidget(root, "COM5", Visueel)

Visueel.addWidget(Arduino1)
Visueel.addWidget(Arduino2)
Visueel.addWidget(Arduino3)
Visueel.addWidget(Arduino4)
Visueel.addWidget(Arduino5)
Visueel.showGui()

root.mainloop()

我已经搜索了一个多小时的答案,但似乎找不到。这可能吗?

最佳答案

您可以使用 isinstance检查它是哪个类:

    def setSensors(self):
        print("Set the temperature and light of the sensors")
        # Check which subclass is used
        if isinstance(self, lightWidget):
            print(lightWidget.__name__)
        else:
            print(temperatureWidget.__name__)
        self.maxRolloutPositionLabel.config(text="Rolling distance (cm): " + str(self.maxRolloutEntry.get()))

关于Python - 检查正在使用哪个子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780397/

相关文章:

python - 根据第一个数组的条件查找第二个数组中的值。最有效的方法是什么?

python - 将 slider 放在 matplotlib 中子图的正下方

python-3.x - 如何修复在 CMD get 的 DLL 错误中启动但在 Pycharm 和 Anaconda Comand Promt 中运行的 Python 脚本

python - Tkinter 如何更改 TreeView 所选项目的颜色

python - 用于水平边缘滚动(在 Linux 中)的 Tkinter 事件是什么?

python - 使用 tkinter 输入一个变量,被调用

python - Keras | 对象本地化预测整个图像

python - 使用 vaex 绘制大数据图

python - 在大型文本文件中搜索字符串 - 分析 python 中的各种方法

python - 基于列名在 pandas 数据框的 lambda 表达式上使用 if else 语句