İşlev çoğaltma ve genel değişkenlerle ilgili sorun PySide6 uygulamasında, düğmeye basıldığında gün ve ay yazdırmak için bir işlev çoğaltılır

0

Soru

Ben bir acemiyim ve kaçırdığım bir şey olduğunu biliyorum ama tam olarak ne olduğunu bilmiyorum, Bu yüzden bir PySide6 uygulamam var ve python'da takvim modülünü kullanarak bir qtablewidget'te takvim oluşturmak için bir işlev oluşturdum navigasyon düğmeleri eklemek için önceki ve sonraki ay almaya çalıştığımda gayet iyi çalışıyor ama sorun çıktı : Bu benim işlevim:

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)

Uygulamayı çalıştırdığımda takvim, GUI tablosunun görüntü görüntüsünde olduğu gibi tabloda gösterilir

Konsol çıktı Konsolu 11 2021 yazdırır

İlk kez pushButton_3 tıkladığımda normal çalışıyor ve konsolda '12 2021' yazdırıyor konsol 12 2021 yazdırıyor Ancak aynı düğmeye tekrar tıkladıktan sonra çoğaltmaya başlar: konsol '12 2021 1 2022' yazdırır konsol 12 2021 1 2022 yazdırır Tekrar tıklarsam yazdırılır '12 2021 1 2022 1 2022 2 2022' resimdeki gibi buraya resim açıklamasını girin her tıklamada sadece bir ifade yazdırması gereken yerde daha fazla çoğaltır, yani '2 2022'

Aşağıdaki satırları calendar_gen () işlevinden çıkarmaya çalıştım, ancak genel değişkenleri bildirdikten ve parametrelere atadıktan sonra bile parametreleri teslim edemedim :

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

Bunu yapmak için çalıştım: Calendar_gen () işlevinin içinde global değişkenleri bildirdim ve global parametre gibi bir şey oluşturmak için bunları işlev parametrelerine atadım

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

sonra init (self) işlevinde bu 2 satırı koydum:

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

Ancak bu konsolda işe yaramadı, uygulamayı çalıştırdığımda '11 2021' yazdırıyor, ardından pushbutton_3'e tıkladığımda '12 2021' yazdırıyor ve tekrar tıkladığımda '12 2021' yazdırıyor tekrar ve benzeri Diğer düğmeyle aynı şekilde tekrar tekrar '10 2021' yazdırır

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

En iyi cevabı

0

Qt sinyal bağlantıları özel değildir (varsayılan olarak) ve bir sinyal aynı işleve birden çok kez bağlanabilir.

Bağlantı kurduğunuzdan beri clicked düğmelerin sinyalleri calender_gen bu işlev her çağrıldığında, bu sinyallere başka bir bağlantı ekliyorsunuz. Sonuç olarak, bağlı işlevler, sinyal her yayıldığında bağlandıkları kadar çağrılacaktır.

Uygun bir çözüm, ayı değiştirecek işlevlere bağlanmak ve "yeni" ay hesaplaması için geçerli aya bir başvuru tutmaktır.

İşlevler hemen hemen aynı olduğundan, bunları benzersiz bir işlevde gruplandırmak ve ardından sinyalleri, bu eski işlevi uygun bir parametreyle çağıracak ayrı işlevlere bağlamak daha iyidir:

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)

Açıkçası, qcalendarwidget'i düzgün bir şekilde uygulamak, işlevlerin çoğunu zaten sağladığı için çok daha basit olabilir.

2021-11-21 23:56:46

Diğer dillerde

Bu sayfa diğer dillerde

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