टिंकर बटन और एंट्री

मेरे पास कुछ परिभाषित फ़ंक्शन हैं जिन्हें मैं अपने जीयूआई में बटन बनाना चाहता हूं। इनमें से कुछ कार्यों में एक या दो तर्क (संख्याएं) की आवश्यकता होती है और यही कारण है कि मेरे लिए समस्याएं पैदा हो रही हैं। मैंने बटन और एक प्रविष्टि के बीच संयोजन के बारे में सोचा है, जहां मैं विशिष्ट बटन (मेरे कार्यों में से एक के लिए) पर क्लिक करता हूं, एक प्रविष्टि पॉप अप होगी जहां मैं किसी संख्या में टाइप करता हूं। फिर जब मैं एंटर दबाता हूं तो मैं चाहता हूं कि इस नंबर को मेरे बटन पर लगाए गए फ़ंक्शन के लिए तर्क के रूप में उपयोग किया जाए और फिर फ़ंक्शन निष्पादित किया जाना चाहिए।

1 फ़ंक्शन मैं एक बटन से बांधना चाहता हूं:

def move(power, tacho_units):
    MOTOR_CONTROL.cmd(5, power, tacho_units, speedreg=0, smoothstart=1, brake=0)
    is_ready(5)

हम लेगो मिंडस्टॉर्म के साथ काम कर रहे हैं, इसलिए मुझे यकीन है कि उदाहरण के लिए उपरोक्त कार्य कुछ लोगों के लिए थोड़ा उलझन में हो सकता है।

from Tkinter import *

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        self.button = Button(frame, text="Move", command=!_______!)
        self.button.pack(side=LEFT)

root = Tk()

app = App(root)

root.mainloop()

root.destroy()

क्या किसी के पास मेरे लिए कोई सुझाव/समाधान है? अगर कोई मेरी मदद कर सकता है तो मैं सराहना करता हूं। क्या मैं एक फ़ंक्शन बनाता हूं (जो एक प्रविष्टि के साथ एक नई विंडो खुलता है) जिसे मैं मूव बटन पर क्लिक करते समय कॉल करता हूं? प्रविष्टि में टाइप करने वाली संख्या (शक्ति और tacho_units) जो मैं फ़ंक्शन के लिए उपयोग करना चाहता हूं वह है जब मैं एंटर दबाता हूं।

0
मेरे पास एक सुझाव है - कोड दिखाएं।
जोड़ा लेखक furas, स्रोत
कृपया अपने प्रश्न में कुछ कोड शामिल करें।
जोड़ा लेखक sPaz, स्रोत

2 उत्तर

तर्क के साथ फ़ंक्शन असाइन करने के लिए lambda फ़ंक्शन का उपयोग करें

some_power = ... # set value
some_tacho_units = ... # set value

self.button = Button(frame, text="Move", command=lambda a=some_power,b=some_tacho_units:move(a, b) )

या

self.button = Button(frame, text="Move", command=lambda:move(5, 10))
0
जोड़ा

आम तौर पर, विजेट से जुड़े फ़ंक्शन में तर्क पारित करने का तरीका लैम्ब्डा या functools.partial (नोट : ये केवल तरीके नहीं हैं)। ये दोनों कुछ हद तक उन्नत विषय हैं, लेकिन यदि आप केवल एक उदाहरण का पालन करते हैं, तो उन्हें पूरी तरह समझने के बिना उनका उपयोग करना काफी सुरक्षित है।

लैम्ब्डा का उपयोग करके एक उदाहरण यहां दिया गया है:

b = tk.Button(..., command=lambda power=1, tacho_units="x": move(power, tacho_units)

तकनीकी रूप से सही नहीं होने पर, बस एक लैम्ब्डा को "डीफ़" के रूप में सोचें लेकिन बिना किसी नाम के। यह तर्क लेता है और कार्यों को कॉल कर सकता है।

Functools.partial का उपयोग कर, वही बात है:

b = tk.Button(..., command=functools.partial(move, power=1, tacho_units="x"))

नोट: आपको Functools के लिए एक आयात कथन जोड़ना होगा।

सार में functools.partial फ़ंक्शन प्रतिलिपि बनाता है (इस मामले में, चाल) और तर्कों के लिए डिफ़ॉल्ट मान प्रदान करता है। इस प्रकार, जब आप इसे बिना किसी तर्क के कहते हैं (जैसे टिंकर डिफ़ॉल्ट रूप से करता है), पैरामीटर में ये डिफ़ॉल्ट मान होंगे।

तथापि...

अक्सर अपने फ़ंक्शन को कॉल करने के लिए फ़ंक्शन लिखना आसान होता है। इस अतिरिक्त कार्य का उद्देश्य इनपुट को इकट्ठा करना है - संभावित रूप से अन्य विगेट्स से - और फिर अंतिम फ़ंक्शन को कॉल करें। उदाहरण के लिए:

def do_move():
    power = power_input.get()
    tacho_units = tacho_input.get()
    move(power, tacho_units)

b = tk.Button(..., command=do_move)

चाहे आप इस तीसरे विधि का उपयोग करते हैं, इस पर निर्भर करता है कि तर्क मान कहां से आते हैं। यदि आप विजेट बनाते समय मूल्यों को जानते हैं, तो लैम्ब्डा या functools.partial कामों का उपयोग करके आप वहां तर्कों को एम्बेड कर सकते हैं। यदि आप अन्य विगेट्स से पैरामीटर प्राप्त करने जा रहे हैं, तो तीसरा फॉर्म बेहतर है।

0
जोड़ा
जवाब के लिए धन्यवाद! चूंकि हर बार जब मैं तीसरे सुझाव के लिए जाता हूं तो बिजली और tacho_units समान नहीं होंगे। आइए कहें कि मैं एंट्री-विजेट से पावर और tacho_units प्राप्त करना चाहता हूं। मैं इस बारे में सोच रहा हूं कि जब मैं चाल बटन पर क्लिक करता हूं, तो एक प्रविष्टि खोली जाएगी। और जब मैं चाल-फ़ंक्शन के लिए तर्क टाइप करता हूं और एंटर दबाता हूं, तो उन तर्कों का उपयोग चाल-फ़ंक्शन के साथ किया जाएगा। चूंकि मैं टिक्टर के लिए नया हूं, मुझे कोई संकेत नहीं है कि मैं इसे कैसे लिख सकता हूं। क्या यह एक अच्छा तरीका है, या क्या कोई आसान/बेहतर समाधान है?
जोड़ा लेखक user3067156, स्रोत
मेरे लिए कुछ भी अच्छा है, जब तक मैं इसे काम करने के लिए मिलता हूं :) अगर मैं अपनी मुख्य विंडो में एंट्री विजेट्स के लिए जाता हूं। मैं अपने बटन के साथ एंट्री विजेट कैसे कनेक्ट करूं? सभी सवालों के लिए खेद है, लेकिन मैं कई दिनों से इस पर अटक गया हूं और मुझे नहीं पता कि यह स्वयं कैसे हल करें।
जोड़ा लेखक user3067156, स्रोत
@ user3067156: अपने पूरे कार्यक्रम के बारे में और जानने के बिना यह कहना असंभव है कि सबसे अच्छा तरीका क्या है। चूंकि मैं व्यक्तिगत रूप से सोचता हूं कि संवाद खराब यूआई डिज़ाइन हैं, मेरे लिए सबसे अच्छा तरीका मुख्य विंडो में एंट्री विजेट होना होगा, इसलिए आप पहले मानों में टाइप करेंगे और फिर "move" पर क्लिक करें। यह सिर्फ मेरी राय है, यह एक निष्पक्ष बेहतर समाधान नहीं है।
जोड़ा लेखक Bryan Oakley, स्रोत