Problema con la funzione di duplicazione e le variabili globali in PySide6 app, una funzione per stampare il giorno e il mese è duplicato quando il pulsante è premuto

0

Domanda

Sono un principiante e mi sa che c'è qualcosa che ho perso, ma non so esattamente cosa, Quindi ho un PySide6 app, e ho creato una funzione per generare un calendario in una QTableWidget utilizzando il modulo calendario in python tutto ha funzionato bene, ma il problema è venuto quando ho provato ad aggiungere un pulsanti di navigazione per ottenere il successivo e il precedente mese: Questa è la mia funzione:

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)

Quando avvio l'app calendario mostra la tabella, come nell'immagine immagine della GUI tabella

L'output della Console Console stampa 11 2021

Quando faccio clic su pushButton_3 per la prima volta, fare clic su di esso funziona normalmente e stampe '12 2021' nella console console stampa 12 2021 Ma dopo che clicco su di nuovo lo stesso pulsante si avvia la duplicazione: console stampa '12 2021 1 2022' console stampa 12 2021 2022 1 Se devo fare nuovamente clic su stampa '12 2021 1 2022 1 2022 2 2022' come nell'immagine inserisci immagine qui la descrizione di ogni fare clic su duplica più dove dovrebbe stampare solo una dichiarazione che ho.e '2 2022'

Ho provato a spostare il seguito linee di calendar_gen funzione() ma ho coudn't consegnare i parametri, anche dopo la dichiarazione di variabili globali e assegnare loro i parametri :

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

Ho provato a fare questo: All'interno del calendar_gen() funzione che ho dichiarato le variabili globali e le loro assegnati alla funzione di parametri, al fine di creare qualcosa di simile a un parametro globale

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

poi nella init(auto) funzione ho messo quelle 2 righe:

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

Ma questo non ha funzionato nella console stampa '11 2021' quando avvio l'app e poi quando clicco su pushButton_3 stampa '12 2021" e quando clicco di nuovo su di esso, stampa '12 2021' di nuovo e così via Stesso con l'altro pulsante stampa '10 2021' di nuovo e di nuovo

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

Migliore risposta

0

Qt connessioni di segnale non sono esclusive (per impostazione predefinita), e un segnale che può essere collegato alla stessa funzione più di una volta.

Dal momento che si sta connettendo il clicked i segnali dei pulsanti calender_gen, ogni volta che la funzione viene chiamata si aggiunge un ulteriore collegamento a tali segnali. Il risultato è che le funzioni collegate verrà chiamato il numero di volte che sono stati collegati ogni volta che il segnale è emesso.

Una corretta soluzione per la connessione alle funzioni che vorresti passare il mese e mantenere un riferimento per il corrente mese per il "nuovo" nel mese di calcolo.

Poiché le funzioni sono quasi identici, è meglio raggrupparli in un'unica funzione, e quindi collegare i segnali di separare le funzioni che alla fine la telefonata che l'ex funzione con un parametro adeguato:

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)

Ovviamente, la corretta attuazione QCalendarWidget potrebbe essere molto più semplice, come già fornisce la maggior parte delle funzionalità.

2021-11-21 23:56:46

In altre lingue

Questa pagina è in altre lingue

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