Problema cu functia de duplicare și variabile globale în PySide6 app, o funcție pentru a imprima zi și lună este duplicat atunci când butonul este apăsat

0

Problema

Eu sunt un incepator si stiu ca nu este ceva ce am omis, dar nu știu exact ce, Asa ca am o PySide6 app, și am creat o funcție pentru a genera un calendar într-un QTableWidget folosind modulul calendar în python totul a lucrat bine, dar problema a venit atunci când am încercat pentru a adăuga un butoanele de navigare pentru a obține următoarea și anterior lunii: Aceasta este funcția mea:

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)

Atunci când am rula aplicația calendar arată în tabelul ca în imaginea de imaginea de GUI masa

Consola de ieșire Consola printuri 11 2021

Când m-am faceți clic pe pushButton_3 pentru prima dată când faceți clic pe acesta funcționează în mod normal și amprentele 12 2021' in consola consola printuri 12 2021 Dar după ce am faceți clic pe același buton din nou începe duplicarea: consola cu amprentele 12 2021 1 2022' consola printuri 12 2021 1 2022 Dacă faceți clic pe se imprimă din nou '12 2021 1 2022 1 2022 2 2022' la fel ca în imaginea introduceți descrierea imaginii aici cu fiecare click se duplicate mai mult în cazul în care aceasta ar trebui să imprimați doar o singură declarație eu.e '2 2022'

Am încercat să mute liniile de mai jos din calendar_gen (funcția) dar te-aș fi putut oferi parametrii, chiar și după declararea variabilelor globale și a le atribui la parametrii :

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

Am încercat pentru a face acest lucru: În interiorul calendar_gen (funcția) am declarat variabile globale și le-a atribuit la parametrii funcției, în scopul de a crea ceva ca un parametru global

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

apoi, în init(auto) funcția-am pus pe cele 2 linii:

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

Dar acest lucru nu au de lucru în consolă se imprimă '11 2021', atunci când am rula aplicația atunci când am faceți clic pe pushButton_3 se imprimă '12 2021' și când m-am faceți clic din nou pe ea, se imprimă '12 2021 din nou și așa mai departe Același lucru cu celalalt buton se imprimă '10 2021 din nou și din nou

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

Cel mai bun răspuns

0

Qt semnal de conexiuni nu sunt exclusive (implicit), și un semnal poate fi conectat la aceeași funcție mai mult de o dată.

Când vă conectați la clicked semnale de butoane în calender_gen, de fiecare dată când această funcție este numit adăugați o suplimentare de conectare a acestor semnale. Rezultatul este că conectate funcții va fi numit ca timp de multe ca acestea au fost conectat de fiecare dată când semnalul este emis.

O soluție bună este să se conecteze la funcțiile pe care ar schimba-o lună și să păstreze o referință la curent lună pentru "noi" luna de calcul.

Deoarece funcțiile sunt aproape identice, este mai bine pentru a le grupa într-o funcție unică, și apoi conectați semnale pentru a separa funcțiile care ar apela în cele din urmă că fostul funcție cu un parametru adecvat:

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)

Evident, în mod corespunzător de punere în aplicare QCalendarWidget ar putea fi mult mai simplă, deoarece oferă deja cele mai multe dintre funcționalitățile.

2021-11-21 23:56:46

În alte limbi

Această pagină este în alte limbi

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