2017-12-26 13 views
0

Ich bin ein 11. Grader (5. Jahr Student), die nur Python-Programmierung Studium begonnen. Ich versuche eine GUI zu erstellen, wo ich wählen kann, welche Form ich mit Turtle zeichnen möchte und welche Werte benötigt werden, um die Form zu zeichnen. Ich schaffte es, dass mit dem folgenden Code zu tun (wo ich bereits die Funktionen der Schildkröte Fraktale haben und importiert diese Datei):Turtle GUI Verbesserung

from tkinter import * 

import turtlegraphics 

from turtle import * 

import math 


#set up the window 

root = Tk() 

root.title('Turtle shapes') 

root.geometry('300x200+100+100') 



#make the interface 

turtleLabel = Label(root, text = 'Turtle Fractals Generator') 

turtleLabel.grid(row = 0, column =1, columnspan =2) 



#order widgets 

orderLabel = Label(root, text ='Order') 

orderLabel.grid(row = 1, column =0) 



orderStr = StringVar() 

orderEntry = Entry(root, textvariable = orderStr) 

orderEntry.grid(row = 1, column = 1, columnspan = 2) 



#length widgets 

lengthLabel = Label(root, text ='Length') 

lengthLabel.grid(row = 2, column =0) 



lengthStr = StringVar() 

lengthEntry = Entry(root, textvariable = lengthStr) 

lengthEntry.grid(row = 2, column = 1, columnspan = 2) 



#button widgets 

def clearF(): 

    #Clear the entries 

    orderStr.set('') 

    lengthStr.set('') 







    return 

#end def 

clearButton = Button(root, text ='Clear', command = clearF) 

clearButton.grid(row = 3, column =1) 





def treeF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 





    turtlegraphics.tree(order,length, pen) 







    return 

#end def 

treeButton = Button(root, text ='Tree', command = treeF) 

treeButton.grid(row = 1, column =3) 


#make a gasket button 

def gasketF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.gasket(order,length,pen) 

    return 
#end def 

gasButton = Button(root, text ='Gasket', command = gasketF) 

gasButton.grid(row = 2, column =3) 


#make a dandelion button 
def dandelionF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.tree4(order,length,pen) 

    return 
#end def 

danButton = Button(root, text ='Dandelion', command = dandelionF) 

danButton.grid(row = 3, column =3) 


#make flalke button 
def kevinF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.k(order,length,pen) 



    return 
#end def 
def flakeF(): 
    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.flake(order,length,pen) 

    return 
#end def 






flakeButton = Button(root, text ='Flake', command = flakeF) 

flakeButton.grid(row = 4, column =3) 




#make a screen and a pen 

pen = Pen() 

screen = Screen() 



pen.speed(0) 

pen.color('blue') 

pen.width(3) 



screen.bgcolor('white') 



root.mainloop() 

Allerdings möchte ich versuchen, eine Liste zu setzen, die Form von eher gewählt als mit mehreren Tasten. Ich verstehe nicht viel über Listen aufgrund der Tatsache, dass ich es noch nicht gelehrt wurde, aber nach Recherchen ist das, was ich habe:

''' 

program gui to draw turtle fractals 

''' 



from tkinter import * 

import turtlegraphics 

from turtle import * 

import math 


#make a screen and a pen 

pen = Pen() 


def treeF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 


    turtlegraphics.tree(order,length, pen) 


    return 

#end def 

#make a gasket button 

def gasketF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.gasket(order,length,pen) 

    return 
#end def 


#make a dandelion button 
def dandelionF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.tree4(order,length,pen) 

    return 
#end def 


#make flalke button 
def kevinF(): 

    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.k(order,length,pen) 



    return 
#end def 
def flakeF(): 
    order = int(orderStr.get()) 

    length = float(lengthStr.get()) 

    turtlegraphics.flake(order,length,pen) 

    return 
#end def 
screen = Screen() 


pen.speed(0) 

pen.color('blue') 

pen.width(3) 



screen.bgcolor('white') 

#set up the window 

root = Tk() 

root.title('turtle shapes') 

root.geometry('600x300+100+100') 


#make the interface 

turtleLabel = Label(root, text = 'Turtle Fractals Generator') 

turtleLabel.grid(row = 0, column =1, columnspan =2) 



#order widgets 

orderLabel = Label(root, text ='Order') 

orderLabel.grid(row = 1, column =0) 



orderStr = StringVar() 

orderEntry = Entry(root, textvariable = orderStr) 

orderEntry.grid(row = 1, column = 1, columnspan = 2) 



#length widgets 

lengthLabel = Label(root, text ='Length') 

lengthLabel.grid(row = 2, column =0) 



lengthStr = StringVar() 

lengthEntry = Entry(root, textvariable = lengthStr) 

lengthEntry.grid(row = 2, column = 1, columnspan = 2) 



#button widgets 

def clearF(): 

    #Clear the entries 

    orderStr.set('') 

    lengthStr.set('') 

    return 

#end def 

clearButton = Button(root, text ='Clear', command = clearF) 

clearButton.grid(row = 3, column =1) 

#list 

def selection(): 
    obj = nameList.curselection()[0] 
    if obj == 'tree': 
      command = treeF 
      return 
    if obj == 'dandelion': 
      command = dandelionF 
      return 
    if obj == 'flake': 
      command = flakeF 
      return 
    if obj == 'gasketF': 
      command = gasketF 
      return 


    #end if 


    #end def 

#create list 
listbox = Listbox(root,selectmode = SINGLE) #select mode is type of 
selection 
listButton= Button(root, text = 'chose fractal') 

labelVar = StringVar() 
nameLabel = Label(root, textvariable = labelVar) 
nameLabel.grid(row = 2 , column = 7, columnspan = 2) 
labelVar.set('choose a fractal') 


names = ['tree','dandelion','flake','gasket'] 
nameList = Listbox(root) 
for i in names: 
    nameList.insert(END, i) 
nameList.grid(row = 4, column =7, columnspan = 2) 

selectionButton = Button(root, text = 'draw', command = selection) 
selectionButton.grid(row = 5, column = 7, columnspan = 2) 



root.mainloop() 

Ich weiß, etwas falsch mit meinem Code, aber ich kann‘ Sag mir nicht, was ich falsch gemacht habe. Wenn ich meinen Code ausführe, bekomme ich keinerlei Fehler, aber er zeichnet nicht die Form. Darüber hinaus erfüllt die Schaltfläche "Löschen" ihre Funktion nicht, wenn sie geklickt wird. Wie kann ich das beheben?

+0

setzen nicht leere Zeile nach jeder Zeile mit Code - es macht Code zu lange, es zu lesen. [PEP 8 - Style Guide für Python Code] (https://www.python.org/dev/peps/pep-0008/) – furas

+0

immer volle Fehlermeldung (Traceback) in Frage stellen (als Text, nicht als Screenshot). Es gibt andere nützliche Informationen. – furas

+0

Was ist 'turtlegraphics'? Ich kann es nicht laufen, ohne 'turtlegraphics' – furas

Antwort

0

Ihr sofortiges Problem ist, wie selection() funktioniert - es wurde Zahlen mit Zeichenfolgen verglichen und haben den Code erforderlich, um eines der Unterprogramme auszuführen. Ich habe es unten überarbeitet, um das gewünschte Verhalten zu erhalten. Ich habe gemacht auch weitere Änderungen und Vereinfachungen:

from tkinter import * 

from turtle import Pen, Screen 

import turtlegraphics 

def treeF(): 

    order = int(orderEntry.get()) 
    length = float(lengthEntry.get()) 

    turtlegraphics.tree(order, length, pen) 

def dandelionF(): 

    order = int(orderEntry.get()) 
    length = float(lengthEntry.get()) 

    turtlegraphics.tree4(order, length, pen) 

def flakeF(): 

    order = int(orderEntry.get()) 
    length = float(lengthEntry.get()) 

    turtlegraphics.flake(order, length, pen) 

def gasketF(): 

    order = int(orderEntry.get()) 
    length = float(lengthEntry.get()) 

    turtlegraphics.gasket(order, length, pen) 

def kevinF(): 

    order = int(orderEntry.get()) 
    length = float(lengthEntry.get()) 

    turtlegraphics.k(order, length, pen) 

fractals = [('tree', treeF), ('dandelion', dandelionF), ('flake', flakeF), ('gasket', gasketF), ('kevin', kevinF)] 

# make a screen and a pen 

screen = Screen() 
screen.bgcolor('white') 

pen = Pen() 
pen.speed('fastest') 
pen.color('blue') 
pen.width(3) 

# set up the window 

root = Tk() 
root.title('turtle shapes') 
root.geometry('600x400+100+100') 

# make the interface 

turtleLabel = Label(root, text='Turtle Fractals Generator') 
turtleLabel.grid(row=0, column=1, columnspan=2) 

# order widgets 

orderLabel = Label(root, text='Order') 
orderLabel.grid(row=1, column=0) 

orderEntry = Entry(root) 
orderEntry.grid(row=1, column=1, columnspan=2) 

# length widgets 

lengthLabel = Label(root, text='Length') 
lengthLabel.grid(row=2, column=0) 

lengthEntry = Entry(root) 
lengthEntry.grid(row=2, column=1, columnspan=2) 

# button widgets 

def clearF(): 

    # Clear the entries 
    orderEntry.delete(0, 'end') 
    lengthEntry.delete(0, 'end') 

clearButton = Button(root, text='Clear', command=clearF) 
clearButton.grid(row=3, column=1) 

# list 

def selection(): 
    selections = nameList.curselection() 

    if selections: 
     selection = selections[0] 

     if selection < len(fractals): 
      name, definition = fractals[selection] 
      definition() 

# create list 
listbox = Listbox(root, selectmode=SINGLE) # select mode is type of selection 
listButton = Button(root, text='chose fractal') 

labelVar = StringVar() 
nameLabel = Label(root, textvariable=labelVar) 
nameLabel.grid(row=2, column=7, columnspan=2) 
labelVar.set('choose a fractal') 

nameList = Listbox(root) 

for name, definition in fractals: 
    nameList.insert(END, name) 

nameList.grid(row=4, column=7, columnspan=2) 

selectionButton = Button(root, text='Draw', command=selection) 
selectionButton.grid(row=5, column=7, columnspan=2) 

root.mainloop() 

Allgemeine Bemerkungen über Ihren Code:

Suche und einen guten Python-Codierung Stil folgen - es macht den Code zu verstehen, schwieriger, wenn Sie Ihre eigene Codierung erfinden "Stil". Diese

ist nicht die richtige Art und Weise zu integrieren Schildkröte mit tkinter. Suchen Stackoverflow oder die Schildkröte Dokumentation, für RawTurtle und TurtleScreen, die Klassen, die Sie verwenden, anstatt Turtle (aka Pen) und Screen wenn in einem bestehenden Tk Fensterstruktur einzubetten.

+0

Ihr Code funktionierte für mich, aber ich bekam immer einen Fehler beim Importieren der Turtlegraphics-Datei, also musste ich einige Dinge ändern. Auch danke für die Beratung. Ich werde mir das merken –