Problème avec la fonction de duplication et de variables globales dans PySide6 application, une fonction pour imprimer le jour et le mois est dupliqué quand une touche est appuyée

0

La question

Je suis un débutant et je sais qu'il est quelque chose que j'ai raté mais je ne sais pas exactement ce que, Donc, j'ai un PySide6 application, et j'ai créé une fonction pour générer un calendrier dans un QTableWidget en utilisant le calendrier du module en python tout a bien fonctionné mais le problème est venu quand j'ai essayé d'ajouter un les boutons de navigation pour obtenir la prochaine et mois précédent: C'est ma fonction:

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)

Quand je lance l'application, le calendrier montre dans le tableau comme dans l'image image de l'interface graphique tableau

La sortie de la Console la Console de tirages de 11 2021

Quand je clique sur pushButton_3 pour la première fois, cliquez sur il fonctionne normalement et imprime '12 2021" dans la console console imprime 12 2021 Mais après que j'ai cliqué sur le même bouton, il commence la duplication: console imprime '12 2021 1 2022' console imprime 12 2021 2022 1 Si je clique à nouveau, il imprime '12 2021 1 2022 1 2022 2 2022' comme dans l'image entrez la description de l'image ici avec chaque clic il reprend de plus là où il devrait imprimer seulement une déclaration que j'ai.e '2 2022'

J'ai essayé de déplacer le dessous des lignes de la calendar_gen fonction() mais je coudn't livrer les paramètres, même après la déclaration de variables globales et de leur attribuer les paramètres :

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))

J'ai essayé de faire ceci: À l'intérieur de la calendar_gen() fonction que j'ai déclaré les variables globales et affectés à des paramètres de la fonction, afin de créer quelque chose comme un paramètre global

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

puis dans le init(self) fonction que j'ai mis ces 2 lignes:

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))

Mais cela n'a pas fonctionné dans la console il imprime '11 2021" quand je exécuter l'application, puis quand je clique sur pushButton_3 il imprime '12 2021" et quand je clique de nouveau sur elle, elle imprime '12 2021" de nouveau et ainsi de suite De même avec l'autre bouton, il imprime '10 2021' encore et encore

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

La meilleure réponse

0

Qt connexions de signal ne sont pas exclusives (par défaut), et un signal peut être connecté à la même fonction qu'une seule fois.

Puisque vous êtes à la connexion de l' clicked les signaux des boutons en calender_gen, à chaque fois que la fonction est appelée, vous êtes en train d'ajouter un plus de la connexion à ces signaux. Le résultat est que les fonctions de connectivité sera appelée autant de fois qu'ils ont été connectés à chaque fois le signal est émis.

Une bonne solution est de se connecter à l'fonctions du commutateur du mois et de conserver une référence à l' actuel mois pour la "nouvelle" mois de calcul.

Étant donné que les fonctions sont presque identiques, il est préférable de les regrouper en une fonction unique, puis de connecter les signaux à des fonctions distinctes qui ferait éventuellement appel à l'ancienne à la fonction avec un paramètre approprié:

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)

De toute évidence, la bonne application de QCalendarWidget pourrait être beaucoup plus simple, car il fournit déjà la plupart des fonctionnalités.

2021-11-21 23:56:46

Dans d'autres langues

Cette page est dans d'autres langues

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