मुझे एक समस्या हो रही है जिसे हल करने में मुझे समस्या हो रही है। मैं टिंकर के साथ एक पायथन इंटरफ़ेस बना रहा हूं जो उपयोगकर्ता को कुछ पैरामीटर (संख्या और लंबाई) के साथ पूर्वनिर्धारित आकृति बनाने की अनुमति देता है। पूर्वनिर्धारित आकृति फ़ंक्शन "पेड़" दूसरी पायथन फ़ाइल में है। ऐप ठीक चलता है यदि "पेड़" फ़ंक्शन मुख्य पायथन फ़ाइल में है यानी सब कुछ एक विंडो में आता है। अगर मैं दूसरी पायथन फ़ाइल (figures.py) में "पेड़" आकृति डालता हूं और इसे आयात करने का प्रयास करता हूं तो ऐप दूसरी विंडो बनाएगा और पेड़ की आकृति इच्छित मुख्य विंडो के बजाय वहां खींची जाएगी। मैं फ़ंक्शन का संदर्भ और आयात कैसे कर सकता हूं ताकि यह मुख्य ऐप विंडो में आ जाए। धन्यवाद!

मुख्य पायथन फ़ाइल

import turtle
import tkinter
from tkinter.ttk import *
import figures

# Main function is defined.
def main():
    # Set root and create canvas
    root = tkinter.Tk()
    root.title("Draw")
    canvas = tkinter.Canvas(root, width=800, height=700)
    canvas.pack(side=tkinter.RIGHT)

    # create a turtle to draw on the canvas 
    pen = turtle.RawTurtle(canvas)
    screen = pen.getscreen()

    # Set screen co-ordinates.
    screen.setworldcoordinates(-200, -700, 800, 700)
    screen.bgcolor("grey")

    # Draw frame  
    frame = tkinter.Frame(root, bg="white")
    frame.pack(side=tkinter.LEFT, fill=tkinter.BOTH)

    pointLabel = tkinter.Label(frame, text="Fractal", bg="white", )
    pointLabel.pack()

    # make the dropdown for fractal  list
    turtleNames = ["Tree", "Dandelion"]
    turtleStr = tkinter.StringVar()
    turtleList = OptionMenu(frame, turtleStr, turtleNames[0], *turtleNames)
    turtleList.pack()

    numberLabel = tkinter.Label(frame, text="Number")
    numberLabel.pack()

    # the entry widget must be given a string.
    number = tkinter.StringVar()
    numberEntry = tkinter.Entry(frame, textvariable=number)
    numberEntry.pack()
    number.set(str(3))

    lengthLabel = tkinter.Label(frame, text="Length")
    lengthLabel.pack()

    # User sets length
    length = tkinter.StringVar()
    lengthEntry = tkinter.Entry(frame, textvariable=length)
    lengthEntry.pack()
    length.set(str(200))

    def drawHandler():
        # get the value from orderStr and make int
        num = int(number.get())

        # get the value from lengthStr and make int
        len = int(length.get())

        figures.tree(num, len)

    # Event handler to clear canvas for a new drawing
    def clearHandler():
        pen.clear()

    # This is an event handler. Handling the quit button press results in quitting the application.
    def quitHandler():
        root.destroy()
        root.quit()

    # Draw Buttons

    # presses of the "Draw" button.
    drawButton = tkinter.Button(frame, text="Draw", command=drawHandler)
    drawButton.pack()

    # presses of the "Clear" button.
    clearButton = tkinter.Button(frame, text="Clear", command=clearHandler)
    clearButton.pack()

    # presses of the "Quit" button.
    quitButton = tkinter.Button(frame, text="Quit", command=quitHandler)
    quitButton.pack()

    # tells the application to enter its event processing loop
    tkinter.mainloop()

# Python jumps right here after executing the def main() line. These two lines tell
if __name__ == "__main__":
    main()

पूर्वनिर्धारित डिजाइनों को संग्रहीत करने के लिए Figs.py

from turtle import *

pen = Pen()

screen = Screen()


# 1st figure Tree
def tree(n, l):
    if n == 0 or l < 2:
        return
    # endif
    pen.forward(l)
    pen.left(45)
    tree(n - 1, l / 2)
    pen.right(90)
    tree(n - 1, l / 2)
    pen.left(45)
    pen.backward(l)
0
MarcusRey 27 अक्टूबर 2018, 18:14

1 उत्तर

सबसे बढ़िया उत्तर

ऐप ठीक चलता है यदि "पेड़" फ़ंक्शन मुख्य पायथन फ़ाइल में है यानी सब कुछ एक विंडो में आता है। अगर मैं दूसरी पायथन फ़ाइल (figures.py) में "पेड़" आकृति डालता हूं और इसे आयात करने का प्रयास करता हूं तो ऐप दूसरी विंडो बनाएगा और पेड़ की आकृति इच्छित मुख्य विंडो के बजाय वहां खींची जाएगी।

समस्या यह है कि Figs.py मुख्य कार्यक्रम से स्वतंत्र एक कछुआ वातावरण स्थापित कर रहा है - इसे करने न दें। मुख्य कार्यक्रम के कछुआ वातावरण में संचालित करने के लिए जो कुछ भी आवश्यक है, उसे Figurs.py कार्यों में पास करें:

figures.py

# 1st figure Tree
def tree(pen, number, length):
    if number == 0 or length < 2:
        return

    pen.forward(length)
    pen.left(45)
    tree(pen, number - 1, length / 2)
    pen.right(90)
    tree(pen, number - 1, length / 2)
    pen.left(45)
    pen.backward(length)

# test this code standalone
if __name__ == "__main__":
    import turtle

    tree(turtle.getpen(), 5, 100)  # test using default turtle

    turtle.exitonclick()

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

मुख्य पायथन फ़ाइल

def drawHandler():
    # get the value from orderStr and make int
    number_int = int(number.get())

    # get the value from lengthStr and make int
    length_int = int(length.get())

    figures.tree(pen, number_int, length_int)

जैसे ही आप Python के बिल्ट-इन len फंक्शन को फिर से परिभाषित कर रहे थे, मैंने वेरिएबल नाम बदल दिए।

1
cdlane 27 अक्टूबर 2018, 18:08