কী-বোর্ড ব্যবহার করে অসীম লুপ রয়েছে এমন পাইকিজিআইএস স্ক্রিপ্ট থামানো হচ্ছে?


12

সুতরাং আমি একটি স্ক্রিপ্ট লিখেছিলাম যা আমি "যখন সত্য:" একটি নির্দিষ্ট সময়ের ব্যবধানে (সময় ব্যবহার করে প্রতি 5 সেকেন্ডে ব্যবহার করি leep এতদূর ভাল, কিন্তু যখন আমি এটি থামাতে চাই তখন আমি পারছি না।

আমি নিয়ন্ত্রণ + সি, নিয়ন্ত্রণ + বিরতি, পালানোর চেষ্টা করেছি এবং এটি ব্যবহারিকভাবে আমার কীবোর্ডকে উপেক্ষা করে। এটি বন্ধ করার একমাত্র উপায় হ'ল কিউজিআইএস বন্ধ করা। কোন ধারনা? তদ্ব্যতীত, যখন স্ক্রিপ্টটি সময়টি হিট করে।

আমার লিপিটি এখানে:

from PyQt4.QtGui import *
from PyQt4.QtCore import *
from qgis.core import *
from qgis.utils import iface
import time


while True: 

    def change_color():
        active_layer = iface.activeLayer()
        pipeline=[]
        txt=open('C:/users/stelios/desktop/project/Sensor.txt','r')
        for line in txt.readlines():
            pipeline.append(line.split())
        print pipeline 
        pipeline2=[]
        for label,color in pipeline:
            if "0" in color:
                pipeline2.append([label,"green"])
            else:
                pipeline2.append([label,"red"])

        print pipeline2
        elatomatikoi=""
        categories=[]

        for label,color in pipeline2:
            if 'red' in color:
                elatomatikoi=elatomatikoi + label+","
            symbol = QgsSymbolV2.defaultSymbol(active_layer.geometryType())
            symbol.setColor(QColor(color))
            category = QgsRendererCategoryV2(int(label), symbol, label)
            categories.append(category)

        expression = 'id' 
        renderer = QgsCategorizedSymbolRendererV2(expression, categories)
        active_layer.setRendererV2(renderer)
        active_layer.setCacheImage(None)
        iface.mapCanvas().refresh()
        iface.legendInterface().refreshLayerSymbology(active_layer)
        elatomatikoi= elatomatikoi[:-1]

        for label,color in pipeline2:
            if 'red' in color:
                QMessageBox.critical(None,"Warning",("Leakage at pipe(s):%s\nCheck Pipeline status " %elatomatikoi))
                break
        txt.close()

    change_color()
    time.sleep(5)

'প্রস্থান' ট্রিগার করা উচিত এমন শর্তগুলি কী?
11:34

1
কিউজিসে কোনও নিষিদ্ধকরণ প্রক্রিয়া বাস্তবায়নের অনেকগুলি উপায় রয়েছে। আপনি কিউটি ইভেন্টের লুপটিতে না রেখে নিয়ন্ত্রণ পাচ্ছেন। আমি অন্বেষণ করার পরামর্শ দিই: 1) ইভেন্ট-চালিত আর্কিটেকচার তৈরি করুন বা 2) অজগর উপপ্রক্রিয়া বা সরল উপায়ে আপনার প্রক্রিয়া পরিচালনা করুন) একটি প্রসেসিং টুলবক্স স্ক্রিপ্ট তৈরি করুন এবং প্রয়োজনে পছন্দ 2
লুইজি পাইরেলি

3
বন্ধুরা সম্ভবত আমি এটি ভুল উপায়ে বলেছি। আমাকে প্রশ্নটি নতুন দৃশ্যের সাথে পুনরায় লিখতে দাও: আপনি কিউজিআইএসে পাইথন কনসোলটি খুলুন, আপনি টাইপ করুন: যখন 1: "a" মুদ্রণ করুন এবং আপনি এন্টারটি চাপুন। তারপরে এটি চিরকালের জন্য 'এ' প্রিন্ট করে। কিউজিআইএস ছাড়াই আপনি কীভাবে এটি বন্ধ করবেন? এটিই প্রশ্ন এবং আসল সমস্যা
স্টিলিওস এম

এটি সাধারণ পাইথনের আরও প্রশ্ন হতে পারে, তাই স্ট্যাকওভারফ্লোতে উত্তর পাওয়ার জন্য আপনার ভাগ্য ভাল হত।
মার্টিন

@ মার্টিন করবে তবে এটি একটি অত্যন্ত শক্তিশালী প্রশ্ন এবং এটি আমাকে বিস্মিত করে যে কিউজিআইএসের প্রধান বিকাশকারীরা তাদের পাইথন কনসোলে অসীম লুপ দৃশ্যের কথা ভাবেন নি। আপনার মেশিনে 1: প্রিন্ট করার সময় আপনি যদি নির্বাহ করেন, আপনি কি কীবোর্ড দিয়ে এটিকে থামাতে পারবেন বা এটি আমার সিস্টেমের দোষ?
স্টিলিওস এম

উত্তর:


2

কিউজিআইএস আপনাকে অজগরটির পুরো শক্তি সরবরাহ করে। এটি আশ্চর্যজনক সম্ভাবনাগুলি উন্মুক্ত করে তবে সম্ভাব্য ক্ষতির সাথেও আসে। যা কিউজিআইএসকে প্রতিক্রিয়াহীন, হিমশীতল এমনকি ক্র্যাশ করতে পারে। বুদ্ধিমানের সাথে এটি ব্যবহার করুন!

আপনার ক্ষেত্রে, মূল থ্রেডটি 5 সেকেন্ডের জন্য ঘুমানোর পরিবর্তে, আপনি কিউজিআইএসকে আরও ভাল কিছু করতে দিন (যেমন আপনার কীস্ট্রোক বা বোতাম টিপস শোনার মতো) এবং টাইমারের ইভেন্টটিকে মূল ইভেন্ট লুপে পোস্ট করুন যা নিয়ন্ত্রণটি ফিরিয়ে আনবে to আপনার স্ক্রিপ্ট 5 সেকেন্ড পরে।

আপনি এই উত্তর থেকে উদাহরণটি একটি ভাল সূচনা পয়েন্ট হিসাবে ব্যবহার করতে পারেন । এটি বন্ধ করতে, কেবল stop()টাইমারের স্লটে কিছু ইভেন্ট সংযুক্ত করুন।

def change_color():
    print('I am now red')

timer = QTimer()
timer.timeout.connect(change_color)
timer.start(5000)

someButton.clicked.connect(timer.stop)

বা কনসোল থেকে ম্যানুয়ালি কল করুন যখন আপনি যখন মনে করেন এটি বন্ধ করার সময় এসেছে

timer.stop()

আপনার যদি প্রয়োজন হয় তবে কী চাপতে বাধা দেওয়ার জন্য আপনি উইন্ডোতে একটি ইভেন্ট ফিল্টার () ইনস্টল করতে পারেন।


0

চারপাশের কাজ হিসাবে, আপনি একটি বাতিল বোতাম সহ একটি কিউটি উইজেট ব্যবহার করতে পারেন।

এটি কিছুটা রুক্ষ, তবে আমি যে উইজেট স্ক্রিপ্টটি ব্যবহার করেছি তা এখানে:

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_Form(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.setupUi(self)
        self.running = True
    def setupUi(self, Form):
        Form.setObjectName(_fromUtf8("Form"))
        Form.resize(100, 100)
        self.horizontalLayout_3 = QtGui.QHBoxLayout(Form)
        self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
        self.horizontalLayout = QtGui.QHBoxLayout()
        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
        self.Cancel_btn = QtGui.QPushButton(Form)
        self.Cancel_btn.setMinimumSize(QtCore.QSize(0, 0))
        self.Cancel_btn.setMaximumSize(QtCore.QSize(425, 27))
        self.Cancel_btn.setObjectName(_fromUtf8("Cancel_btn"))
        self.horizontalLayout.addWidget(self.Cancel_btn)
        self.horizontalLayout_3.addLayout(self.horizontalLayout)
        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(_translate("Form", "Cancel", None))
        self.Cancel_btn.setText(_translate("Form", "Cancel", None))
        self.Cancel_btn.clicked.connect(self.Cancel)


    def Cancel(self):
        self.running = False

এটি আপনার পাইকিগিস স্ক্রিপ্টে আমদানি করা যেতে পারে (আপনাকে ডিরেক্টরিটি সিস.পাথের সাথে সংযুক্ত করতে হবে) এবং তারপরে লুপটি থামাতে আপনি চলমান চলকটি ব্যবহার করতে পারেন:

import sys
sys.path.append("path/to/cancel_widget")

import cancel_widget

btn = cancel_widget.Ui_Form()
btn.show()

while btn.running:
    ...
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.