Problema con la función de duplicación y variables globales en PySide6 de la aplicación, una función para imprimir el día y el mes se duplica cuando se presiona el botón

0

Pregunta

Soy un principiante y sé que hay algo que me perdí, pero no sé exactamente qué, Así que tengo un PySide6 de la aplicación, y he creado una función para generar un calendario en un QTableWidget uso del calendario módulo en python todo funcionaba bien, pero el problema vino cuando intenté agregar un botones de navegación para obtener la siguiente y el mes anterior: Este es mi función:

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)

Cuando ejecuto la aplicación calendario muestra en la tabla como en la imagen de la imagen de la interfaz de usuario de la tabla

La salida de la Consola la Consola de impresiones 11 2021

Cuando hago clic en pushButton_3 por primera vez, haga clic funciona normalmente y se imprime '12 2021' en la consola la consola de impresiones 12 2021 Pero después de hacer clic en el mismo botón de nuevo se inicia la duplicación: consola de impresiones '12 2021 2022 1' de la consola de impresiones 12 2021 2022 1 Si hago clic en el botón de nuevo se imprime '12 2021 1 2022 1 2022 2 2022' como en la imagen de entrar en la descripción de imágenes aquí con cada clic se duplica más donde sólo debe imprimir una declaración yo.e '2 2022'

Yo traté de mover el por debajo de las líneas de la calendar_gen() función, pero me coudn no entregar los parámetros, incluso después de declarar variables globales y asignar a los parámetros :

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

He tratado de hacer esto: Dentro de la calendar_gen() función que he declarado las variables globales y asignados a los parámetros de la función para crear algo como un parámetro global

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

a continuación, en el init(auto) función puse esos 2 líneas:

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

Pero esto no funciona en la consola imprime '11 2021' cuando ejecuto la aplicación, a continuación, cuando hago clic en pushButton_3 imprime '12 2021' y cuando me vuelva a hacer clic en él, se imprime '12 2021' de nuevo y así sucesivamente Mismo con el otro botón se imprime '10 2021' de nuevo y de nuevo

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

Mejor respuesta

0

Qt conexiones de señal no son exclusivos (por defecto), y una señal puede ser conectado a la misma función más de una vez.

Puesto que usted está conectando el clicked las señales de los botones en calender_gencada vez que se llama a la función que está añadiendo además conexión a esas señales. El resultado es que el conectado de funciones de llamada tantas veces como haya sido conectado cada vez que la señal es emitida.

Una adecuada solución es conectar a las funciones que habría de cambiar el mes y mantener una referencia a la actual mes para el "nuevo" mes de la computación.

Dado que las funciones son casi idénticos, es mejor agruparlos en una única función y, a continuación, conecte las señales para separar las funciones que eventualmente se le llame a lo que el ex de la función con un parámetro adecuado:

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)

Obviamente, la implementación apropiada de QCalendarWidget podría ser mucho más sencillo, ya que proporciona la mayor parte de las funcionalidades.

2021-11-21 23:56:46

En otros idiomas

Esta página está en otros idiomas

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