RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1576862
Accepted
Garp
Garp
Asked:2024-04-19 18:01:48 +0000 UTC2024-04-19 18:01:48 +0000 UTC 2024-04-19 18:01:48 +0000 UTC

如何编写一个类来确认访问结束并能够取消其中执行的最后一个操作?

  • 772

有一个类有两个方法:

  • method1()- 一次添加一个(增量);
  • method2()- 获取一个字符串并将其添加到列表中。

你需要什么:

  1. 完成使用某个方法后(不是每次调用后,而是不再需要该方法后),您需要通过调用 来表明这一点escape_method()。
    如果您忘记执行此操作,则:

    • 第二种方法将无法使用
    • 当您完成该类的工作时(见下文),菜单将不会出现。
  2. 您还需要指示该类的工作结束(方法调用escape_class())。
    此方法将返回“是”\“否”菜单。

    • 如果“是”,则保存更改,我们可以获得变量。
    • 如果“否”——他们就没有得救。

仅当那些已工作method1且method2已关闭的项目才会被调用。‘关闭’课程后,my_list也可以counter通过调用来获取get_data()。

  1. 一次只能有一个(method1()或)方法在运行method2(),您需要了解是哪一个。
    这是通过一个变量来完成的,其中写入当前方法的名称,并且可以获取该变量。escape_method它在方法调用之间保留此状态,并在 close( ) 当前方法后重置。

  2. 我们需要能够撤消 和 的最后一个method1()操作method2()。

这些方法彼此不相关;一个的完成并不意味着另一个的开始。

我大致做了第1 - 3点,但我不喜欢它的工作原理(特别是复选框不太可靠)。
我怎样才能改变这个?您可能需要装饰器或外部控制类。

此外,类必须my_list仅counter通过方法get_data()并且仅在方法关闭后(因此方法被关闭)返回变量。
如何实施?

第4点很麻烦,我都不想贴了。如何撤消上次操作?

class DataProcessing:
    def __init__(self):
        self.my_list = []                    # method1
        self.counter = 0                     # method2
        self.current_method = 0              # текущий метод
        self.are_methods_closed = True       # флажок закрытия метода
        self.is_class_closed = True          # флажок закрытия класса

    def method1(self):
        if self.are_methods_closed:
            self.are_methods_closed = False           # начало сессии этого метода
            self.current_method = 1
            self.counter += 1
        elif self.are_methods_closed == False and self.current_method == 1:   # продолжение сессии этого метода
            self.counter += 1

    def method2(self, value):
        if self.are_methods_closed:
            self.are_methods_closed = False
            self.current_method = 2
            self.my_list.append(value)
        elif self.are_methods_closed == False and self.current_method == 2:
            self.my_list.append(value)

    def escape_method(self):
        self.are_methods_closed = True
        self.current_method = 0

    def escape_class(self):
        if self.are_methods_closed:
            text = input("Сохранить изменения? \n Введите Да либо Нет: ")
            if text == 'Да':
                print('Изменения сохранены')
                self.is_class_closed = True
            elif text == 'Нет':
                print('Изменения не сохранены')
                self.is_class_closed = True
            else:
                pass

    def get_data(self, n):
        if n == 1:
            return(self.counter)
        elif n == 2:
            return (self.my_list)
python
  • 1 1 个回答
  • 66 Views

1 个回答

  • Voted
  1. Best Answer
    S. Nick
    2024-04-20T22:39:14Z2024-04-20T22:39:14Z

    我试图实现你写的内容。
    事实上我并没有正确理解你想要做什么。
    尝试运行我的示例,慢慢按下可用按钮,并仔细观察屏幕上发生的情况。

    import sys
    import random
    from PyQt5.Qt import *
    
    
    class DataProcessing(QMainWindow):
        def __init__(self):
            super().__init__()
            self.centralWidget = QWidget()
            self.setCentralWidget(self.centralWidget)
            
            self.my_list = []                                            # method2
            self.counter = 0                                             # method1
    
            self.label_1 = QLabel("Method 1", alignment = Qt.AlignCenter)
            self.label_2 = QLabel("Method 2", alignment = Qt.AlignCenter)
    
            self.textBrowser_1 = QTextBrowser()
            self.textBrowser_2 = QTextBrowser()
            
            self.button_1 = QPushButton("Go method1")
            self.button_1.clicked.connect(self.method1)
            self.button_1.setCheckable(True)
    
            self.button_2 = QPushButton("Go method2")
            self.button_2.setCheckable(True)
            self.button_2.clicked.connect(
                lambda ch, value=None: self.method2(ch, value))
            
            self.layout = QGridLayout(self.centralWidget)
            self.layout.addWidget(self.label_1, 0, 0)
            self.layout.addWidget(self.label_2, 0, 1)
            self.layout.addWidget(self.textBrowser_1, 1, 0)
            self.layout.addWidget(self.textBrowser_2, 1, 1)
            self.layout.addWidget(self.button_1, 2, 0)
            self.layout.addWidget(self.button_2, 2, 1)
            
            self.timer = QTimer()
            self.timer.timeout.connect(self._update)
            self.timer.setInterval(1500)
            self.timer.start()
            
        def _update(self):        
            if self.button_1.isChecked():
                self.method1(True)
            elif self.button_2.isChecked():
                value = random.randint(0, 100)
                self.method2(True, value)        
            
        def method1(self, state):
            """ method1 прибавляет по единице (инкремент) """
    
            if state:
                self.button_2.setEnabled(False)
                self.button_1.setText("Остановить method1")
                self.counter += 1
                self.textBrowser_1.setHtml(
                    f'Работает  method1.<br> counter = {self.counter}<br>')
            else:
                self.button_1.setText("Go method1") 
                self.button_2.setEnabled(True)
                self.textBrowser_1.moveCursor(QTextCursor.End)            
                self.textBrowser_1.insertHtml(
                    '<b style="font-size: 22px; color: red">method1 отклучен</b> <br><br>')
            
                self.escape_method() 
    
        def method2(self, state, value):
            """ method2 принимает строку и добавляет её в список """
            
            if state:
                self.button_1.setEnabled(False)
                if value:
                    self.button_2.setText("Остановить method2")
                    self.my_list.append(value)
                    self.textBrowser_2.setHtml(
                        f'Работает  method2.<br> item = {value}; '
                        f'записей {len(self.my_list)}<br>')            
            else:
                self.button_1.setEnabled(True)
                self.button_2.setText("Go method2")            
                self.textBrowser_2.moveCursor(QTextCursor.End)            
                self.textBrowser_2.insertHtml(
                    '<b style="font-size: 22px; color: red">method2 отклучен</b> <br><br>')
                        
                self.escape_method()
    
        def escape_method(self):
            if not self.button_1.isChecked() and not self.button_2.isChecked(): 
                self.escape_class()
            
        def escape_class(self):
            msg = QMessageBox.question(
                self, 
                "Сообщение вопроса",
                "Сохранить изменения?      ",
                QMessageBox.Yes | QMessageBox.No)
                
            if msg == QMessageBox.Yes:
                print('Изменения сохранены')
                self.get_data()
            else:
                print('Изменения не сохранены')
                self.method4()
                
        def method4(self):
            msg = QMessageBox(self)
            msg.setWindowIcon(QIcon("icono.png"))
            msg.setWindowTitle("Пользовательское сообщение")
            msg.setIconPixmap(QPixmap("Qt.png").scaled(100, 100, Qt.KeepAspectRatio))
            msg.setText("Это окно сообщения <b>ПОЛЬЗОВАТЕЛЬСКОЕ</b>    ")
            msg.setInformativeText(
                """Есть возможность отмены последнего действия для method1 или method2. 
    Выберите какое действие вы хотите отменить или откажитесь.
                """)
                
            buttonMethod1 = msg.addButton("method1", QMessageBox.YesRole)           
            buttonMethod2 = msg.addButton("method2", QMessageBox.AcceptRole)
            buttonCancel = msg.addButton("Отменить", QMessageBox.RejectRole)
            msg.exec_()
            
            if msg.clickedButton() == buttonMethod1:
                self.counter -= 1
                self.textBrowser_1.insertHtml(
                    f'Отменено последнее действие method1.<br> '
                    f'counter = {self.counter}<br><br>')        
            elif msg.clickedButton() == buttonMethod2:
                if not self.my_list:
                    # my_list - пустой
                    return
                self.my_list.pop()
                self.textBrowser_2.insertHtml(
                    f'Отменено последнее действие method2.<br> '
                    f'Всего элементов {len(self.my_list)}, '
                    f'последний item = {self.my_list[-1]}<br><br>')  
            elif msg.clickedButton() == buttonCancel:
                pass
        
        def get_data(self):                          #, n):           n <---- ?
    #        if n == 1: return(self.counter)
    #        elif n == 2: return (self.my_list)
    
            self.textBrowser_1.insertHtml(
                f'''<b style="font-size: 18px; color: green">
                 == The End ==<br><br>
                 counter={self.counter}
                </b> <br><br>''')
    
            self.textBrowser_2.insertHtml(
                f'''<b style="font-size: 18px; color: green">
                 == The End ==<br>
                </b> <br>''')
            for item in self.my_list:
                self.textBrowser_2.insertHtml(
                    f'''<b style="font-size: 18px; color: green">
                     item={item}
                    </b> <br>''')        
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        app.setFont(QFont("Times", 12, QFont.Bold))
        window = DataProcessing()
        window.resize(600, 400)
        window.show()
        sys.exit(app.exec())
    

    在此输入图像描述

    在此输入图像描述

    在此输入图像描述

    • 3

相关问题

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

  • telebot.anihelper.ApiException 错误

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

  • 解析多个响应

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

Sidebar

Stats

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

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 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