PySide2 में, यदि मैं एक QDoubleSpinBox बनाता हूं और स्पष्ट रूप से इसकी decimals-प्रॉपर्टी को 2 और इसकी singleStep-प्रॉपर्टी को 0.1 पर सेट करता हूं और फिर अप/डाउन बटन के माध्यम से इसका मान बदलता हूं, तो मुद्रित मान में कभी-कभी एक होता है बहुत अधिक सटीकता।

ऐसा क्यों है?

हालांकि यह आवश्यक रूप से इस मान के साथ की जा रही गणनाओं के लिए एक समस्या नहीं हो सकती है, यह उपयोगकर्ता अनुभव को प्रभावित कर सकता है:

मेरे मामले में मैं QPushButton को अक्षम करना चाहता हूं यदि स्पिनबॉक्स-मान 0.0 है और इसे अन्यथा सक्षम करें। स्पिनबॉक्स-वैल्यू वास्तव में 0 के करीब कुछ बनने के मामले में, बटन (साथ ही स्पिनबॉक्स 'डाउन-एरो) अक्षम नहीं होता है, हालांकि स्पिनबॉक्स के अंदर पठनीय संख्या "0,00" कहती है।


उपयोगकर्ता अनुभव को ठीक करने के लिए मैं इस समय क्या करता हूं:

int(self.spin.value()*100) > 0

की बजाय:

self.spin.value() > 0.0

क्या वास्तव में ऐसा करने का यह सबसे अच्छा तरीका है?


अवांछित व्यवहार को पुन: उत्पन्न करने के लिए यहां एक छोटा सा उदाहरण दिया गया है:

import sys
from PySide2 import QtWidgets

class Window(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.spin = QtWidgets.QDoubleSpinBox(self)
        self.spin.setDecimals(2)
        self.spin.setSingleStep(0.1)
        self.button = QtWidgets.QPushButton(self)
        self.button.move(0, 40)
        self.spin.valueChanged.connect(self.on_spin_value_change)
        self.show()

    def on_spin_value_change(self, value):
        print(value)
        self.button.setEnabled(value > 0.0)


app = QtWidgets.QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())

यह एक उदाहरण आउटपुट है:

enter image description here


संपादित करें: नहीं, मेरा प्रश्न केवल "पायथन में फ्लोट्स की तुलना कैसे करें" पर नहीं आता है। मैंने QDoubleSpinBoxes के उपयोगकर्ता अनुभव को ठीक करने के लिए और एक स्पष्टीकरण के लिए कहा कि मूल्य का आंतरिक प्रतिनिधित्व दृश्य से अलग क्यों है। हां, फ्लोट की तुलना करने के लिए एक अलग तरीका चुनना समस्या को हल कर सकता है, लेकिन एक और ओवरलोडेड सिग्नल का उपयोग करना मेरे लिए बेहतर समाधान है - एक समाधान जो मुझे नहीं बताया जाता अगर मेरा प्रश्न नहीं होता क्यूटी/पायसाइड-विशिष्ट।

2
S818 31 जुलाई 2019, 16:46

1 उत्तर

समस्या कंप्यूटर मेमोरी में फ़्लोट्स का प्रतिनिधित्व है wikipedia

अपने कोड में जोड़ें from math import isclose और चेंज बटन चेक ऑन करें self.button.setEnabled(not isclose(0, value, abs_tol=1e-9))

अन्य समाधान, गणित के बिना abs का उपयोग करें और मूल्य की तुलना कुछ बहुत छोटी संख्या से करें। self.button.setEnabled(abs(value) > 1e-9)

2
Grzegorz Bokota 2 अगस्त 2019, 00:00