Problém s funkcí duplikace a globální proměnné v PySide6 aplikace, funkce tisku, den a měsíc je duplicitní, když tlačítko stisknete

0

Otázka

Jsem začátečník a vím, že tam je něco, co jsem vynechal, ale nevím přesně co, Takže mám PySide6 aplikace, a vytvořil jsem funkce pro generování kalendáře v QTableWidget pomocí modulu kalendář v pythonu všechno fungovalo v pořádku, ale problém nastal, když jsem se snažil chcete-li přidat navigační tlačítka, aby si další a předchozí měsíc: Tohle je moje funkce:

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)

Když jsem se spustit aplikaci kalendář zobrazuje v tabulce jako na obrázku image GUI stůl

Konzole výstup Konzole otisky 11 2021

Když jsem klikněte na pushButton_3 pro první čas, klepněte na tlačítko funguje normálně a vytiskne '12 2021 v konzole konzola otisky 12 2021 Ale poté, co jsem klepněte na stejné tlačítko znovu začíná zdvojení: konzole vypíše '12 2021 1 2022' konzole otisky 12 2021 2022 1 Když jsem klepněte na tlačítko znovu tiskne '12 2021 1 2022 1 2022 2 2022' jako na obrázku zadejte popis obrázku zde s každým kliknutím to kopíruje více, kde je třeba tisknout pouze jedno prohlášení, které jsem.e '2 2022'

Snažil jsem se přesunout níže uvedené řádky z calendar_gen() funkce, ale I coudn ' t doručit parametry, a to i po deklarování globální proměnné a přiřadit jim parametry :

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 jsem se udělat toto: Uvnitř calendar_gen() funkce jsem deklaroval, globální proměnné a přiřadit jim funkce parametry tak, aby se vytvořit něco jako globální parametr

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

pak v _ _ init _ _ (self) funkce jsem dal ty 2 řádky:

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 nefunguje v konzoli to vytiskne '11 2021, když jsem spustit aplikaci, a pak, když jsem klikněte na pushButton_3 to vytiskne '12 2021' a když jsem se znovu klikněte na něj, tiskne '12 2021 znovu a tak dále Stejné s ostatními tlačítko vytiskne '10 2021 znovu a znovu

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

Nejlepší odpověď

0

Qt signálu připojení nejsou exkluzivní (výchozí), a signál může být připojen ke stejné funkci více než jednou.

Když jste připojení clicked signály z tlačítek v calender_genpokaždé , když je volána funkce přidáváte další napojení na tyto signály. Výsledkem je, že připojené funkce se bude jmenovat, jak mnoho času, jak byly připojeny pokaždé, když je signál emitován.

Správné řešení je, připojit se na funkce, které by se mělo přepnout na měsíc a dál odkaz na aktuální měsíc, a to pro "nové" měsíc výpočtu.

Protože funkce jsou téměř totožné, to je lepší, aby skupiny je v unikátní funkce, a pak se připojit signály oddělit funkce, které by nakonec říkat, že bývalý funkce s vhodným parametrem:

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)

Je zřejmé, že řádné provádění QCalendarWidget může být mnohem jednodušší, jak to již nabízí většinu funkcí.

2021-11-21 23:56:46

V jiných jazycích

Tato stránka je v jiných jazycích

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