Problém s funkciou duplicite a globálne premenné v PySide6 aplikácie, funkcie tlač deň a mesiac je zdvojený, keď je tlačidlo stlačené

0

Otázka

Som začiatočník a viem, že tam je niečo som vynechal, ale neviem presne čo, Tak mám PySide6 app, a vytvoril som funkciu na generovanie kalendár v QTableWidget pomocou kalendára modul python všetko fungovalo v poriadku, ale problém prišiel, keď som sa snažil pridať navigačné tlačidlá ak chcete získať ďalší a predchádzajúci mesiac: Toto je moja funkcia:

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)

Keď som sa spustiť aplikácia kalendár zobrazuje v tabuľke ako v obraze obraz GUI tabuľka

Výstup Konzoly Konzoly vypíše 11 2021

Keď kliknem na pushButton_3 na prvýkrát, kliknite na položku funguje normálne a vypíše '12 2021' v konzoly konzoly vypíše 12 2021 Ale potom, čo som kliknutím na to isté tlačidlo znova začína duplicite: konzole vypíše '12 2021 1 2022' konzoly vypíše 12 2021 1 2022 Ak by som znova kliknite vytlačí '12 2021 1 2022 1 2022 2 2022' rovnako ako v obrázku zadajte popis obrázku tu s každým kliknite to duplikáty viac, kde by mal tlačiť len na jednom výkaze som.e '2 2022'

Snažil som sa pohybovať pod linky z calendar_gen() funkciu, ale I coudn nie dodať parametre, a to aj po deklarovaní globálne premenné a ich priradiť k parametre :

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

Snažil som sa na to: Vo vnútri calendar_gen() funkcia som vyhlásil globálne premenné a priradiť ich k funkcii parametre s cieľom vytvoriť niečo ako globálny parameter

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

potom v init(self) funkcia som dal tie 2 riadky:

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

Ale to nefungovalo konzoly vytlačí '11 2021" keď som spustiť aplikáciu potom, keď som kliknite na pushButton_3 vytlačí '12 2021" a keď som sa znova kliknite na ňu tlačí '12 2021' znova, a tak na Isté s druhou tlačidlo vytlačí '10 2021' znova a znova

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

Najlepšiu odpoveď

0

Qt signál pripojenia nie sú exkluzívne (predvolene), a signál môže byť pripojené k rovnakej funkcii viac ako raz.

Keďže máte pripojenie clicked signály z tlačidiel v calender_gen, zakaždým, že funkcia sa nazýva pridávate ďalšie pripojenie na tieto signály. Výsledkom je, že spojené funkcie sa nazýva toľko času, ako boli spojené vždy, keď sa signál vysiela.

Správne riešenie je pripojenie na funkcie, ktoré by prepnúť mesiac a majte odkaz na aktuálny mesiac pre "nové" mesiac výpočet.

Pretože funkcie sú takmer totožné, je lepšie skupiny v jedinečnej funkcie, a potom pripojte signály samostatné funkcie, ktoré by nakoniec hovoru, že bývalý funkcia vhodný parameter:

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)

Samozrejme, správne vykonávanie QCalendarWidget môže byť oveľa jednoduchšia, ako to už poskytuje väčšinu funkcií.

2021-11-21 23:56:46

V iných jazykoch

Táto stránka je v iných jazykoch

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