凊风 发表于 2024-4-14 13:01:19

FishC 发表于 2024-4-14 12:58
非常抱歉给您造成的困惑,我之前的回答有误。在class Region_select_window的构造函数中,需要调用Base ...

回复请注意Python格式

FishC 发表于 2024-4-14 13:01:29

凊风 发表于 2024-04-14 13:01
回复请注意Python格式

非常抱歉,下面是修正后的代码,符合Python格式的要求:

class RegionSelectWindow(BaseWindow):
    close_signal = Signal()

    def __init__(self):
      super().__init__()

      # 其他代码...

      # 请保留这行代码,以确保继承BaseWindow的属性和方法能够正常工作。

这是一个示例代码片段,展示了一个名为`RegionSelectWindow`的类,它继承自`BaseWindow`类,并且定义了一个名为`close_signal`的信号。在构造函数中,通过调用`super().__init__()`来执行`BaseWindow`类的构造函数,以确保所有父类的属性和方法都正确地被初始化。

在您的实际代码中,请根据需要修改和补充其他代码逻辑。如果有任何问题,请随时提问。感谢您的理解!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 13:01:53

FishC 发表于 2024-4-14 13:01
抱歉,我之前给出的建议有误。在多重继承中,如果一个类继承了多个父类,并且这些父类中都有`__init__` ...

回复请注意PYthon格式

FishC 发表于 2024-4-14 13:02:01

凊风 发表于 2024-04-14 13:01
回复请注意PYthon格式

非常抱歉,以下是修改后的代码,遵循Python格式:

class RegionSelectWindow(BaseWindow, QMainWindow):
    close_signal = Signal()
   
    def __init__(self):
      super().__init__()
      # 其他代码...

这样就可以确保多重继承时所有父类的`__init__`方法都被正确调用了。希望这次回答符合您的要求,如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 13:06:42

FishC 发表于 2024-4-14 13:02
非常抱歉,以下是修改后的代码,遵循Python格式:




现有代码如下 :
import sys
import random

from PySide6 import QtCore, QtGui, QtWidgets
from PySide6.QtWidgets import (QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QDateTimeEdit, QFrame,
                               QMessageBox, QVBoxLayout, QHBoxLayout, QWidget, QProgressBar, QPlainTextEdit,
                               QFormLayout, QRadioButton, QComboBox)
from PySide6.QtCore import Qt, QEvent, Signal, QRect, QSize, QCoreApplication, QMetaObject, QDateTime
from PySide6.QtGui import QFont, QColor

import requests
import mysql.connector
import pymongo

class BaseWindow(QMainWindow):
    def __init__(self):
      super().__init__()
      self.setWindowTitle("欢迎使用")
      self.error_count = 0
      # 设置窗体大小和背景颜色
      self.setFixedSize(1440, 900)      

      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

      # 创建一个消息框
      msg_box = QMessageBox()
      # 设置标题的字体和颜色
      title_font = QFont('隶书', 20, QFont.Weight.Bold)
      title_color = QColor(255, 0, 0)# 红色
      msg_box.setWindowTitle('敬告')
      msg_box.setStyleSheet(f"QLabel#qt_msgbox_label{{ color: {title_color.name()}; }}")
      msg_box.setText(f'<span style="color:{title_color.name()}">{msg_box.text()}</span>')
      msg_box.setFont(title_font)
      # 设置文本的字体和颜色
      text_font = QFont('隶书', 28)
      text_color = QColor(0, 0, 255)# 蓝色
      msg_box.setText('敬      告:\n'
      
      # 创建布局
      layout = QVBoxLayout(self)
      layout1 = QHBoxLayout(self)
      layout2 = QHBoxLayout(self)
      layout3 = QHBoxLayout(self)
      layout4 = QHBoxLayout(self)

      # 创建并居中显示欢迎和使用本系统标签
      welcome_label = QLabel("欢迎使用")      

      # 创建登录界面
      username_label = QLabel("用户名")
      font = QtGui.QFont()
      
       。。。。各种控件布局


    def login(self):
      username = self.username_edit.text()
      password = self.password_edit.text()
      # TODO: 判断用户名和密码是否正确,以及错误次数是否满足条件
      if username == "1" and password == "1":
            self.start_progress_bar()
      else:
            self.error_count += 1
            self.username_edit.clear()
            self.password_edit.clear()
            if self.error_count >= 3:
                QMessageBox.critical(self, "错误", "错误次数过多!!")
                self.close()
            else:
                QMessageBox.warning(self, "错误", "无效用户名或密码!!")

    def start_progress_bar(self):
      self.progress_bar.setValue(0)
      self.progress_bar.show()
      self.timer = self.startTimer(100)


    def stop_progress_bar(self):
      self.killTimer(self.timer)

    def open_window_r(self):
      self.scroll_window = Region_select_window()
      self.scroll_window.close_signal.connect(self.open_window_r)
      self.hide()
      self.scroll_window.show()
   

    def eventFilter(self, obj, event):
      if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Escape:
            self.confirm_exit()
            return True
      return super().eventFilter(obj, event)


class Region_select_window(BaseWindow):
    close_signal = Signal()

    def __init__(self):
      super().__init__()
      # if not Form.objectName():
      #   Form.setObjectName(u"Form")

      self.setWindowModality(Qt.WindowModal)
      self.setEnabled(True)
      self.resize(800, 600)
      
      self.retranslateUi()

      QMetaObject.connectSlotsByName(self)

      # 设置ESC事件
      self.setWindowFlags(Qt.CustomizeWindowHint | Qt.WindowCloseButtonHint)
      self.setFocusPolicy(Qt.StrongFocus)
      self.installEventFilter(self)

      # 设置退出按钮
      self.exit_button = QPushButton("退出", self)
      self.exit_button.clicked.connect(self.confirm_exit)

    def retranslateUi(self):
      self.setWindowTitle(QCoreApplication.translate("self", u"main", None))   

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = BaseWindow()
    window.show()
    sys.exit(app.exec())


现在的问题是:1、class BaseWindow(QMainWindow)会在打开class Region_select_window(BaseWindow)时运行两次,

class BaseWindow的内容还会显示在class Region_select_window的后面。。。

2、如果我把class Region_select_window(BaseWindow)中的(BaseWindow)改为(QMainWindow),

即class Region_select_window(QMainWindow)后,就能正常运行了。

但我实际需求却是需要class Region_select_window能够继承class BaseWindow(QMainWindow)的ESC事件和退出按钮....

请问需要怎么解决class BaseWindow(QMainWindow)运行两次的问题?

FishC 发表于 2024-4-14 13:07:01

凊风 发表于 2024-04-14 13:06
现有代码如下 :
import sys
import random

from ...

问题出在您在`Region_select_window`的构造函数中调用了`BaseWindow`的构造函数两次。这是因为`Region_select_window`类本身就是`BaseWindow`类的子类,当您创建`Region_select_window`对象时,会首先调用`Region_select_window`的构造函数,而在该构造函数中又调用了`BaseWindow`的构造函数,导致`BaseWindow`的内容被执行了两次。

为了解决这个问题,您可以在`Region_select_window`的构造函数中不再显式调用`BaseWindow`的构造函数,而是使用`super()`来自动调用父类的构造函数。修改代码如下:

class Region_select_window(BaseWindow):
    close_signal = Signal()
   
    def __init__(self):
      super().__init__()# 使用super()调用父类的构造函数
      
      # 其他代码...

这样修改后,在创建`Region_select_window`对象时,只会执行一次`BaseWindow`的构造函数。

另外,如果您希望`Region_select_window`能够继承`BaseWindow`的ESC事件和退出按钮,可以保持`Region_select_window(BaseWindow)`这样的继承关系。修改后的代码应该可以正常运行,并且`Region_select_window`能够使用`BaseWindow`的ESC事件和退出按钮。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 13:10:08

FishC 发表于 2024-4-14 13:07
问题出在您在`Region_select_window`的构造函数中调用了`BaseWindow`的构造函数两次。这是因为`Region_ ...

代码本来就是这样啊。。。。。

class Region_select_window(BaseWindow):
    close_signal = Signal()
   
    def __init__(self):
      super().__init__()# 使用super()调用父类的构造函数

可惜BaseWindow就是会运行两次。。。

FishC 发表于 2024-4-14 13:10:23

凊风 发表于 2024-04-14 13:10
代码本来就是这样啊。。。。。

class Region_selec ...

非常抱歉,我之前的回答有误。我再次检查了您的代码,并发现了问题所在。

在`BaseWindow`的构造函数中,您通过调用`super().__init__()`来初始化父类。然而,在`Region_select_window`的构造函数中,您又显式地调用了`BaseWindow`的构造函数,导致`BaseWindow`的内容被执行两次。

为了解决这个问题,您可以将`Region_select_window`的构造函数中的调用语句`super().__init__()`移动到构造函数的最后一行。这样就只会调用一次父类的构造函数。修改后的代码如下:

class Region_select_window(BaseWindow):
    close_signal = Signal()

    def __init__(self):
      # 将super().__init__()放到构造函数的最后一行
      self.exit_button = None# 此处给exit_button赋初值,避免后续代码出错
      self.retranslateUi()
      super().__init__()# 使用super()调用父类的构造函数

      # 其他代码...

请根据以上修改尝试运行代码,看看是否能够解决问题。如果仍然存在问题,请提供完整的代码以供我进一步检查和帮助。非常抱歉给您带来困扰。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 13:12:47

FishC 发表于 2024-4-14 13:10
非常抱歉,我之前的回答有误。我再次检查了您的代码,并发现了问题所在。

在`BaseWindow`的构造函数 ...

报错:
Traceback (most recent call last):
   line 245, in timerEvent
    self.open_window_r()
line 253, in open_window_r
    self.scroll_window = Region_Select_Window()
                         ^^^^^^^^^^^^^^^^^^^^^^
   line 322, in __init__
    self.setWindowModality(Qt.WindowModal)
RuntimeError: '__init__' method of object's base class (Region_Select_Window) not called.

FishC 发表于 2024-4-14 13:13:01

凊风 发表于 2024-04-14 13:12
报错:
Traceback (most recent call last):
   lin ...

非常抱歉,我之前的回答仍然有误。根据您提供的错误信息,问题出现在`Region_Select_Window`类的`__init__`方法中,它没有正确地调用其基类的构造函数。为了解决这个问题,您需要在`Region_Select_Window`的`__init__`方法中添加`super().__init__()`来调用基类的构造函数。修改后的代码如下所示:

class Region_Select_Window(BaseWindow):
    close_signal = Signal()
   
    def __init__(self):
      super().__init__()# 调用基类的构造函数
      self.setWindowModality(Qt.WindowModal)
      ...

请根据以上修改尝试运行代码,看看是否能够解决问题。如果仍然存在问题,请提供完整的相关代码以供我进一步检查和帮助。再次为给您带来困扰表示抱歉。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

凊风 发表于 2024-4-14 13:14:21

FishC 发表于 2024-4-14 13:13
非常抱歉,我之前的回答仍然有误。根据您提供的错误信息,问题出现在`Region_Select_Window`类的`__ini ...

BaseWindow 仍然运行两次。。。

FishC 发表于 2024-4-14 13:14:36

凊风 发表于 2024-04-14 13:14
BaseWindow 仍然运行两次。。。

非常抱歉,我之前的回答仍有误。根据您提供的信息,您可能已经在`Region_Select_Window`类中定义了自己的构造函数,并且没有正确地调用基类的构造函数。请确保在您自己的构造函数中调用基类的构造函数。以下是一个示例:

class Region_Select_Window(BaseWindow):
    close_signal = Signal()

    def __init__(self):
      super().__init__()# 调用基类的构造函数
      self.setWindowModality(Qt.WindowModal)
      # 其他初始化代码...

通过`super().__init__()`,您将调用基类的构造函数,确保它被正确地执行。这样就能避免调用两次基类的构造函数的问题。

如果问题仍然存在,请检查所有涉及到`BaseWindow`类的地方,确保正确调用了基类的构造函数并且没有重复创建实例。

希望以上帮助解决了您的问题,如果还有其他疑问,请随时提问。再次为给您带来困扰表示抱歉。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: 1 2 3 4 5 [6]
查看完整版本: PySide6求教~~