Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在循环中多次打开窗口_Python_Loops_User Interface_Pyqt5_Window - Fatal编程技术网

Python 在循环中多次打开窗口

Python 在循环中多次打开窗口,python,loops,user-interface,pyqt5,window,Python,Loops,User Interface,Pyqt5,Window,我希望有人能帮助我 目标是: 单击按钮“button_trog”时,应启动一个循环,根据从spinbox“spinbox_count”中选择的数字,打开一个新窗口一段特定的时间,以提供输入内容的可能性 情况: 到目前为止,这是可行的,但问题是窗口只打开一次 当我点击accepted按钮时,它应该会再次打开 我不知道下一步该尝试什么,因为我的理解是它应该再次打开窗口。。。 我的意思是循环正在工作,我用print()函数试过了 这是主窗口文件中的代码: 代码:spinbox\u计数 self.spi

我希望有人能帮助我

目标是: 单击按钮“button_trog”时,应启动一个循环,根据从spinbox“spinbox_count”中选择的数字,打开一个新窗口一段特定的时间,以提供输入内容的可能性

情况: 到目前为止,这是可行的,但问题是窗口只打开一次

当我点击accepted按钮时,它应该会再次打开

我不知道下一步该尝试什么,因为我的理解是它应该再次打开窗口。。。 我的意思是循环正在工作,我用print()函数试过了

这是主窗口文件中的代码:

代码:spinbox\u计数

self.spinbox_count = QtWidgets.QSpinBox(self.centralwidget)
    self.spinbox_count.setGeometry(QtCore.QRect(370, 430, 70, 30))
    font = QtGui.QFont()
    font.setPointSize(15)
    self.spinbox_count.setFont(font)
    self.spinbox_count.setObjectName("spinbox_count")
代码:按钮

self.button_trog = QtWidgets.QPushButton(self.centralwidget)
    self.button_trog.setGeometry(QtCore.QRect(530, 390, 200, 100))
    font = QtGui.QFont()
    font.setPointSize(15)
    self.button_trog.setFont(font)
    self.button_trog.setObjectName("button_trog")
    self.button_trog.clicked.connect(self.scanning)
代码:def扫描

    def scanning(self):
    count = self.spinbox_count.value()
    self.lcount = 0

    if count < 1:
        print("Bitte geben Sie eine Stückzahl ein!")

    while self.lcount < count:
        self.window = QtWidgets.QDialog()
        self.ui = Ui_window_scanning()
        self.ui.setupUi(self.window)
        self.window.show()
        self.lcount = self.lcount + 1

提前感谢

问题是,
self.window
属性在每次while循环时都会被覆盖,并且由于对话框没有其他引用,它会被垃圾回收(也称为删除)。你看不到只有一个窗口,你看到的是最后一个窗口

有两种类似的解决方案:

  • 将窗口添加到持久列表中,以便无法删除它们
  • 设置窗口的父级
如果您需要跟踪新创建的窗口(因为您希望以编程方式关闭它们,或者需要访问它们的内容),那么仍然需要一个列表

def scanning(self):
        # ...
        self.window = QtWidgets.QDialog(self)
def扫描(自):
# ...
self.window=qtwidts.QDialog(self)
注意,这是非常重要的:上面的修改是基于这样的假设,即您正确地使用了QWidget的子类(例如QMainWindow),并且您没有使用pyuic工具生成的修改过的文件(或试图模仿其行为)并在其创建的任何类中实现
扫描
(通常命名为
Ui\u MainWindow
或类似名称,并基于简单的python
对象

如果你这样做(我害怕的话),考虑一下:

  • 它不会工作,因为
    self
    不是QWidget的子类,任何QWidget实例都需要它作为父参数
  • 这被认为是一种不好的做法(有很多不应该这样做的原因,其中之一是对象结构的混乱或问题,如本例) 在这种情况下,请阅读官方指南中关于此主题的更多信息,再次使用pyuic生成代码,并实现该文档中解释的程序逻辑(使用上述函数)-多重继承方法通常更好。
    请考虑由于懒惰(“我已经写了很多代码!”)而继续使用修改的PYIC文件的尝试,或者对QT子类的正确使用缺乏理解,只会导致在一定程度上不断增加的问题和问题。无论如何,这将迫使您切换到常用方法,但此时将更加痛苦和困难。

    请提供一份报告,请详细阅读并检查您的缩进。
    def scanning(self):
            # ...
            self.window = QtWidgets.QDialog(self)