问题与功能重复和全球变量在PySide6应用程序,一个功能打印的日期和月份是重复当按下按钮

0

的问题

我是个初学者以及我知道还有什么我错过了但我不知道到底是什么,所以我有一个PySide6应用程序,和我创建了一个函数产生一个日历中的一个QTableWidget使用日历模块中的蟒蛇 所有工作得很好但是问题来了,当我试图添加一个按钮来得到下一个和前一个月: 这是我的功能:

import sys
import os
import platform
import datetime as dt
import time
import calendar

from PySide6 import *
from PySide6 import QtGui
from PySide6 import QtWidgets
from PySide6 import QtCore
from PySide6.QtGui import QColor

from functools import partial

yy = int(dt.datetime.now().strftime("%Y"))
mm = int(dt.datetime.now().strftime("%m"))

class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        global widgets
        widgets = self.ui

        # Calender generator
        self.calender_gen(mm,yy)



    def calender_gen(self, mm_g, yy_g):
        # Creat table rows and columns
        widgets.tableWidget_3.setRowCount(5)
        widgets.tableWidget_3.setColumnCount(7)

        # Table header labels
        week_list = ["Sat","Sun","Mon","Tue","Wed","Thu","Fri"]
        widgets.tableWidget_3.setHorizontalHeaderLabels(week_list)

        # Start inserting days of the month into the table
        row = 0
        col = 0
        for week in calendar.monthcalendar(yy_g,mm_g):
            for day in week:
                if day == 0:
                    widgets.tableWidget_3.setItem(row,col,QTableWidgetItem(" "))
                else:
                    widgets.tableWidget_3.setItem(row,col,QTableWidgetItem(str(day)))
                col += 1
            row += 1
            col = 0
        print(mm_g,yy_g)
        # Connect Buttons to function
        widgets.pushButton_3.clicked.connect(partial(self.next_calendar_butt,mm_g,yy_g))
        widgets.pushButton_2.clicked.connect(partial(self.prev_calendar_butt,mm_g,yy_g))

    def next_calendar_butt(self,mm_new, yy_new):
        mm_new += 1
        if mm_new > 12:
            mm_new = 1
            yy_new += 1

        widgets.tableWidget_3.setRowCount(0)
        widgets.tableWidget_3.setColumnCount(0)
        self.calender_gen(mm_new,yy_new)

    def prev_calendar_butt(self,mm_g_new,yy_g_new):
        mm_g_new -= 1
        if mm_g_new == 0:
            mm_g_new = 12
            yy_g_new -= 1

        widgets.tableWidget_3.setRowCount(0)
        widgets.tableWidget_3.setColumnCount(0)
        self.calender_gen(mm_g_new,yy_g_new)

当我运行的应用程序的日历显示在表中作为图像中的 形象GUI表

控制台输出 控制台打印11 2021

当我点pushButton_3第一次点击,它工作正常和印刷品'12 2021'在控制台 控制台打印12 2021 但是之后我点击相同的按钮又开始重复:控制台打印'12 2021年1 2022' 控制台打印12 2021年1 2022 如果我再次点击,它的印花'12 2021 1 2022 1 2022 2 2022' 作为图像中的 输入图像描述这里 的每一击重复的更多,它应该仅印一份声明。e'2 2022'

我试图将以下行出的calendar_gen()function但我并非提供的参数,即使在宣布全球变量,并将其分配给参数:

widgets.pushButton_3.clicked.connect(partial(self.next_calendar_butt,mm_g,yy_g))
widgets.pushButton_2.clicked.connect(partial(self.prev_calendar_butt,mm_g,yy_g))

我已经试图这样做: 内部calendar_gen()function我宣布全球变量和分配他们的功能的参数,以便创造的东西就像一个全球参数

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

然后,在 初始化(自我)的功能我把那些2行:

def __init__(self):
    widgets.pushButton_3.clicked.connect(partial(self.next_calendar_butt,var_mm,var_yy))
    widgets.pushButton_2.clicked.connect(partial(self.prev_calendar_butt,var_mm,var_yy))

但是,这不在工作台工作it prints'11 2021'当我运行的应用程序,然后当我点pushButton_3it prints'12 2021'当我再次点击,它印刷品'12 2021'再等等 同样,与其他按钮it prints'10 2021'一次又一次

global-variables pyqt pyqt6 pyside6
2021-11-21 22:34:07
1

最好的答案

0

夸脱的信号连接都不是独有的(默认),和一个信号可以连接到的同样的功能超过一次。

因为你是连接的 clicked 信号的按钮 calender_gen;这一职能是叫你加入一个 进一步 连接到这些信号。 结果是,连接的功能将被称为多的时间,因为他们一直连接的每一个时间信号发射。

一个适当的解决方案是连接的功能会换个月和保持一个参考 一个月的"新的"个月计算。

由于职能是几乎完全相同,这是更好地组他们在一个独特的功能,并随后连接的信号单独的功能,最终将呼叫前的功能,与适当的参数:

class MainWindow(QMainWindow):
    def __init__(self):
        # ...
        self.calender_gen(mm,yy)

        self.pushButton_2.clicked.connect(self.prev_month)
        self.pushButton_3.clicked.connect(self.next_month)

    def calender_gen(self, mm_g, yy_g):
        # Creat table rows and columns
        self.tableWidget_3.setRowCount(5)
        self.tableWidget_3.setColumnCount(7)

        # Table header labels
        week_list = ["Sat","Sun","Mon","Tue","Wed","Thu","Fri"]
        self.tableWidget_3.setHorizontalHeaderLabels(week_list)

        # Start inserting days of the month into the table
        row = 0
        col = 0
        for week in calendar.monthcalendar(yy_g,mm_g):
            for day in week:
                if day == 0:
                    self.tableWidget_3.setItem(row,col,QTableWidgetItem(" "))
                else:
                    self.tableWidget_3.setItem(row,col,QTableWidgetItem(str(day)))
                col += 1
            row += 1
            col = 0

        self.current_month = mm_g
        self.current_year = yy_g

    def prev_month(self):
        self.step_month(-1)

    def next_month(self):
        self.step_month(1)

    def step_month(self, delta):
        mm_new = self.current_month + delta
        mm_year = self.current_year
        if mm_new > 12:
            mm_new = 1
            mm_year += 1
        elif mm_new < 1:
            mm_new = 12
            mm_year -= 1

        self.calender_gen(mm_new, mm_year)

显然,正确实施 QCalendarWidget 可能简单得多,因为它已经提供的大部分功能。

2021-11-21 23:56:46

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................