समस्या के साथ समारोह दोहराव और वैश्विक चर में PySide6 अनुप्रयोग, एक समारोह में मुद्रित करने के लिए दिन और महीने दोहराया गया है जब बटन दबाया

0

सवाल

मैं एक शुरुआत कर रहा हूँ और मैं जानता हूँ कि वहाँ कुछ है, मैं याद किया, लेकिन मैं नहीं जानता कि वास्तव में क्या है, तो मैं एक PySide6 app है, और मैं बनाया एक समारोह उत्पन्न करने के लिए एक कैलेंडर में एक QTableWidget का उपयोग कर कैलेंडर मॉड्यूल में अजगर सब ठीक काम किया है लेकिन समस्या तब आया जब मैं जोड़ने की कोशिश की एक नेविगेशन बटन प्राप्त करने के लिए अगले और पिछले महीने: यह मेरा समारोह:

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)

जब मैं अनुप्रयोग को चलाने के कैलेंडर से पता चलता है तालिका में के रूप में छवि में छवि के जीयूआई टेबल

कंसोल आउटपुट कंसोल प्रिंट 11 2021

जब मैं क्लिक करें पर pushButton_3 के लिए पहली बार क्लिक करें, यह काम करता है और सामान्य रूप से प्रिंट '12 2021' कंसोल में कंसोल प्रिंट 12 2021 लेकिन मैं के बाद ही बटन पर क्लिक करें फिर से इसे शुरू दोहराव: सांत्वना प्रिंट '12 2021 1 2022' सांत्वना प्रिंट 12 2021 2022 1 अगर मैं फिर से क्लिक करें यह प्रिंट '12 2021 1 2022 1 2022 2 2022' के रूप में छवि में प्रवेश छवि विवरण का यहाँ के हर क्लिक के साथ यह डुप्लिकेट और अधिक जहां यह होना चाहिए केवल प्रिंट एक बयान मैं.ई '2 2022'

मैं स्थानांतरित करने की कोशिश की नीचे लाइनों के बाहर calendar_gen() समारोह, लेकिन मैं coudn ' t देने के मापदंडों, यहां तक कि घोषित करने के बाद वैश्विक चर और उन्हें आवंटित करने के लिए पैरामीटर :

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

मैंने कोशिश की है ऐसा करने के लिए: के अंदर calendar_gen() समारोह में, मैं घोषित वैश्विक चर और उन्हें सौंपा कार्य करने के लिए मानकों को बनाने के क्रम में कुछ और की तरह एक वैश्विक पैरामीटर

global var_mm
global var_yy

var_mm = mm_g
var_yy = yy_g

फिर init(स्वयं) समारोह मैं उन 2 लाइनों:

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

लेकिन यह काम नहीं किया कंसोल में यह प्रिंट '11 2021' जब मैं एप्लिकेशन को चलाने के लिए फिर जब मैं क्लिक करें पर pushButton_3 यह प्रिंट '12 2021', और जब मैं फिर से क्लिक करें, यह प्रिंट '12 2021' फिर से और इतने पर एक ही दूसरे के साथ बटन यह प्रिंट '10 2021' फिर से और फिर से

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

सबसे अच्छा जवाब

0

क्यूटी संकेत कनेक्शन अनन्य नहीं कर रहे हैं (डिफ़ॉल्ट रूप से), और एक संकेत से जुड़ा जा सकता है एक ही समारोह में एक बार से अधिक.

के बाद से आप कनेक्ट कर रहे हैं के clicked संकेतों में बटन के calender_gen, हर उस समारोह कहा जाता है जोड़ रहे हैं आगे के लिए कनेक्शन के उन संकेतों. नतीजा यह है कि से जुड़े कार्यों के लिए बुलाया जाएगा के रूप में कई बार के रूप में वे किया गया है से जुड़ा हर समय संकेत उत्सर्जित होता है.

एक उचित समाधान है करने के लिए कनेक्ट करने के लिए कार्य करता है कि स्विच होगा माह और एक संदर्भ रखने के लिए वर्तमान महीने के लिए "नया" महीने की गणना.

के बाद से कार्य कर रहे हैं, लगभग समान है, यह बेहतर करने के लिए उन्हें समूह में एक अनूठा समारोह है, और फिर कनेक्ट संकेतों को अलग करने के लिए कार्य करता है कि अंततः है कि कॉल पूर्व समारोह के साथ एक उपयुक्त पैरामीटर:

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)

जाहिर है, ठीक से लागू करने QCalendarWidget हो सकता है बहुत आसान है, के रूप में यह पहले से ही प्रदान करता functionalities के अधिकांश.

2021-11-21 23:56:46

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में