Problema com a função de duplicação e variáveis globais no PySide6 app, uma função para imprimir o dia e o mês é duplicado quando o botão é pressionado

0

Pergunta

Eu sou um novato e eu sei que há algo que eu perdi, mas eu não sei exatamente o que, Então, eu tenho um PySide6 app, e eu criei uma função para gerar um calendário em uma QTableWidget usando o calendário do módulo em python tudo funcionou bem, mas o problema veio quando eu tentei adicionar botões de navegação para obter o próximo e o mês anterior: Esta é a minha função:

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 eu executar o aplicativo de calendário mostra na tabela como na imagem imagem da GUI tabela

A saída do Console do Console de impressões 11 2021

Quando eu clicar em pushButton_3 pela primeira vez, clique sobre ele funciona normalmente e imprime '12 2021' no console do console de impressões 12 2021 Mas depois que eu clicar no mesmo botão novamente ele começa a duplicação: console imprime '12 2021 2022 1' console imprime 12 2021 2022 1 Se eu clicar novamente ele imprime '12 2021 1 2022 1 2022 2 2022' como na imagem, insira a descrição da imagem aqui com cada clique duplicatas mais de onde ele só deve imprimir uma declaração eu.e '2 2022'

Eu tentei mover as linhas abaixo para fora do calendar_gen() função, mas eu coudn não entregar os parâmetros, mesmo depois de declarar variáveis globais e atribuí-los aos 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))

Eu tentei fazer isso: Dentro do calendar_gen função() eu declaradas as variáveis globais e atribuídos os parâmetros da função, a fim de criar algo como um parâmetro global

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

em seguida, no init(self) função de eu colocar essas 2 linhas:

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

Mas isso não funciona no console ele imprime '11 2021", quando eu executar o aplicativo, em seguida, clique no pushButton_3 imprime '12 2021" e quando eu clicar novamente sobre ele, ele imprime '12 2021" novamente e assim por diante Mesmo com o outro botão que imprime '10 2021' de novo e de novo

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

Melhor resposta

0

Qt conexões de sinal não são exclusivas (por padrão), e um sinal pode ser conectado a mesma função mais de uma vez.

Desde que você está se conectando a clicked sinais dos botões calender_gen, toda vez que a função é chamada, você está adicionando um adicional de conexão para esses sinais. O resultado é que o ligado funções será chamado de quantas vezes eles foram conectados a cada vez que o sinal é emitido.

Uma adequada solução é ligar para as funções que iria mudar o mês e manter uma referência para o corrente mês para o "novo" mês de computação.

Desde que as funções são quase idênticos, é melhor agrupá-los em uma única função, e, em seguida, ligue os sinais para separar as funções que iria chamar, eventualmente, de que o ex-função com um parâmetro adequado:

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, aplicar de forma adequada a QCalendarWidget pode ser muito mais simples, como ele já fornece a maioria das funcionalidades.

2021-11-21 23:56:46

Em outros idiomas

Esta página está em outros idiomas

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