RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1333695
Accepted
Вадим Соловьев
Вадим Соловьев
Asked:2022-09-30 17:36:08 +0000 UTC2022-09-30 17:36:08 +0000 UTC 2022-09-30 17:36:08 +0000 UTC

动态创建窗口并为其分配 ID

  • 772

有一个程序,通过按下按钮,可以创建相应类的窗口。窗口是列表项。

有必要确保每个窗口都有自己的分配id,并且根据id输入的QLineEdit内容,可以向窗口发送包含特定值和命令的变量,例如关闭窗口,使其处于非活动状态或反之亦然活跃,或改变其颜色。

一般如何创建和使用子窗口?

告诉我在哪里可以找到好的课程,教科书,因为 Gosha Dudar 很难!在delphi中一切都简单得多。为什么 Python 是轻量级的?它非常沉重:-(我的代码有多文盲?

整个程序代码:

    from PyQt5 import QtWidgets
    from PyQt5.QtWidgets import QApplication, QMainWindow

    import sys

    child_count = 0
    child_window = []

    class main_window_class(QMainWindow):


        def __init__(self):
            super(main_window_class, self).__init__()
            self.setWindowTitle("Prog_1 Main Window")
            self.setGeometry(100, 100, 500, 500)

            self.btn1 = QtWidgets.QPushButton("Создать дочернее окно", self)
            self.btn1.clicked.connect(self.btn1_on_click)
            self.btn1.setGeometry(0,50,300,50)
            self.name_edit = QtWidgets.QLineEdit("Ваш ник",self)
            self.name_edit.setGeometry(0, 0, 300, 50)

        def print_close_message(self):
            print("кто-то сдох :-(")

        def btn1_on_click(self):
            global child_count, child_window
            child_window.append(child_window_class())
            child_window[child_count].show()
            print(len(child_window))
            child_count += 1
            print("нас стало:",child_count)
            id = child_window.index(child_window) #тут вываливается ошибка
            print("мой id:",id)

    class child_window_class(QMainWindow):
        def __init__(self):
            super(child_window_class, self).__init__()
            self.setWindowTitle("Prog_1 Main Window")
            self.setGeometry(100, 100, 500, 500)


        def closeEvent(self, event):
            global child_count
            event.accept()
            main_window_class().print_close_message()
            child_count -= 1
            print("нас осталось:",child_count)

    def main_application_init():
        app = QApplication(sys.argv)
        main_window = main_window_class()
        main_window.show()
        sys.exit(app.exec_())

    if __name__ == "__main__":
        main_application_init()
python
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    gil9red
    2022-09-30T18:08:08Z2022-09-30T18:08:08Z

    id = child_window.index(child_window) #这里出现错误

    该函数index在列表中查找一个对象,如果它不存在,它将抛出一个异常ValueError,并且您将一个数字传递给该函数,尽管列表中有子窗口的对象。必须用try/捕获异常except。在示例中,我将展示如何处理未在try/中捕获的异常except,通过sys.excepthook

    至于代码,我会说它看起来不错。但是类名应该用大写和驼峰表示,我认为最好不要写在 nameclass中,例如:MainWindow.

    child_count = 0, child_window = []我会将变量转移到类本身MainWindow。是的,而且child_count没有必要,因为。数量可以从列表中获取child_window

    这里,顺便说一句,废话:

    main_window_class().print_close_message()

    您创建一个新窗口并调用它的print_close_message. 在架构上,最好让子窗口通过父窗口并使用它。在print_close_message为子窗口对象添加了一个参数时,小部件将自己写入它,因此父窗口知道子窗口正在关闭

    考虑到评论和建议,更正了代码:

    import sys
    import traceback
    
    from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit, QMessageBox
    
    
    def log_uncaught_exceptions(ex_cls, ex, tb):
        text = '{}: {}:\n'.format(ex_cls.__name__, ex)
        text += ''.join(traceback.format_tb(tb))
    
        print(text)
        QMessageBox.critical(None, 'Error', text)
        sys.exit(1)
    
    
    sys.excepthook = log_uncaught_exceptions
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
    
            self.setWindowTitle("Prog_1 Main Window")
            self.setGeometry(100, 100, 500, 500)
    
            self.btn1 = QPushButton("Создать дочернее окно", self)
            self.btn1.clicked.connect(self.btn1_on_click)
            self.btn1.setGeometry(0, 50, 300, 50)
            self.name_edit = QLineEdit("Ваш ник", self)
            self.name_edit.setGeometry(0, 0, 300, 50)
    
            self.child_windows = []
    
        def print_close_message(self, child: 'ChildWindow'):
            self.child_windows.remove(child)
    
            print(f"кто-то сдох :-(\nнас осталось: {len(self.child_windows)}")
    
        def btn1_on_click(self):
            child_window = ChildWindow(self)
            child_window.show()
    
            self.child_windows.append(child_window)
            print(len(self.child_windows))
    
            print("Нас стало:", len(self.child_windows))
            idx = self.child_windows.index(child_window)
            print("Мой id:", idx)
    
    
    class ChildWindow(QMainWindow):
        def __init__(self, parent: MainWindow):
            super().__init__()
    
            self.parent = parent
    
            self.setWindowTitle("Prog_1 ChildWindow")
            self.setGeometry(100, 100, 500, 500)
    
        def closeEvent(self, event):
            event.accept()
            self.parent.print_close_message(self)
    
    
    def main():
        app = QApplication(sys.argv)
    
        main_window = MainWindow()
        main_window.show()
    
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    
    • 2
  2. S. Nick
    2022-09-30T18:56:32Z2022-09-30T18:56:32Z

    最好的教程是文档,但是您需要时间来学习如何阅读它。

    您选择了一个QMainWindow用于创建应用程序窗口的类——这是一个不错的选择。
    从阅读 Qt Main Window Framework开始。

    您需要掌握的第二个主题是信号和插槽。
    开始阅读信号和插槽

    我们进一步阅读布局管理

    Глобальные переменные - это ЗЛО.

    您的代码可能如下所示:

    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication, QMainWindow
    
    
    class ChildWindow(QMainWindow):
        childSignal = QtCore.pyqtSignal(int)                     # +++
        
        def __init__(self, num):
            super(ChildWindow, self).__init__()
            self.setWindowTitle(f"ChildWindow {num}")
            self.resize(300, 200)
            self.centralWidget = QtWidgets.QWidget()             # !!!
            self.setCentralWidget(self.centralWidget)            # !!!
            self.num = num
    
        def closeEvent(self, event):
            self.childSignal.emit(self.num)                      # +++
    
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super(MainWindow, self).__init__()
            self.centralWidget = QtWidgets.QWidget()             # !!!
            self.setCentralWidget(self.centralWidget)            # !!!
            
            self.child_count = 1
            self.child_window = {}
    
            self.textEdit = QtWidgets.QTextEdit()
            
            self.btn1 = QtWidgets.QPushButton("Создать дочернее окно")
            self.btn1.clicked.connect(self.btn1_on_click)
            
            self.name_edit = QtWidgets.QLineEdit(placeholderText="Введите ваш ник")
            
            self.layout = QtWidgets.QVBoxLayout(self.centralWidget)
            self.layout.addWidget(self.textEdit)
            self.layout.addWidget(self.name_edit)
            self.layout.addWidget(self.btn1)
    
        def btn1_on_click(self):
            if not self.name_edit.text():
                msg = msg = QtWidgets.QMessageBox.information(
                    self, 
                    'Внимание', 
                    'Заполните пожалуйста поле для ввода.'
                )
                return
    
            childWindow = ChildWindow(self.child_count)
            self.child_window[self.child_count] = childWindow
            childWindow.childSignal.connect(self.close_child)       # +++
            childWindow.show()
    
            self.name_edit.clear()
            self.child_count += 1
    
        def close_child(self, num):
    #        print(f"Закрыли окно: {num} --> {self.child_window[num].windowTitle()}")
            self.textEdit.append(f"Закрыли окно: {num} --> {self.child_window[num].windowTitle()}")
    
    
    def main():
        app = QApplication(sys.argv)
        window = MainWindow()
        window.setWindowTitle("Main Window")
        window.resize(400, 100)
        window.show()
        sys.exit(app.exec_())
    
    if __name__ == "__main__":
            main()
    

    在此处输入图像描述

    • 2

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    表格填充不起作用

    • 2 个回答
  • Marko Smith

    提示 50/50,有两个,其中一个是正确的

    • 1 个回答
  • Marko Smith

    在 PyQt5 中停止进程

    • 1 个回答
  • Marko Smith

    我的脚本不工作

    • 1 个回答
  • Marko Smith

    在文本文件中写入和读取列表

    • 2 个回答
  • Marko Smith

    如何像屏幕截图中那样并排排列这些块?

    • 1 个回答
  • Marko Smith

    确定文本文件中每一行的字符数

    • 2 个回答
  • Marko Smith

    将接口对象传递给 JAVA 构造函数

    • 1 个回答
  • Marko Smith

    正确更新数据库中的数据

    • 1 个回答
  • Marko Smith

    Python解析不是css

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5