Преобразование выходных данных меток (string, int, float)

#python #tkinter

#python #tkinter

Вопрос:

Я относительно новичок в python, и я пытался создать «программное обеспечение» с библиотеками turtle и tkinter, цель которого — нарисовать многоугольник с n сторонами, где n — ввод ввода в метке. Также есть простая кнопка, которая в основном инициирует весь процесс. Я дошел до того, что мне нужно определить u как угол, тогда как u = 360 / n; однако я продолжаю получать эту ошибку:

invalid literal for int() with base 10: '' или unsupported operand type(s) for /: 'int' and 'StringVar

Я попытался преобразовать выходные данные метки как в типы информации float, так и в int, однако, похоже, я не совсем понимаю это. Как мне продолжить преобразование выходных данных из записи? Любая помощь очень ценится, и я желаю всем, кто читает это, приятного отдыха. Вот код до сих пор:

 import turtle
import random
#################
canv=tkinter.Canvas(width=400,height=400)
canv.pack()
#################
tcanv=turtle.TurtleScreen(canv)
t=turtle.RawTurtle(tcanv)


n=tkinter.StringVar()
label=tkinter.Label(text="Sides?")
label.pack()
entry=tkinter.Entry(textvariable="n")
entry.pack()


u=(360/n) if n != 0 else 0

def draw():
    for i in range (n):
        t.fd(50)
        t.left(u)

btn=tkinter.Button (text="Draw",fg="black",command=Draw)
btn.pack()
label.mainloop()
entry.mainloop()
btn.mainloop()
  

Комментарии:

1. Это должна быть переменная, например textvariable=n , а также изначально n пустая, что означает, '' что вам нужно дать ей некоторое время для ввода. Поэтому поместите его внутрь функции или немного задержите, пока не введете ввод

2. И могу я спросить, какой самый простой способ отложить это? Однако первое, что пришло мне в голову time.sleep() , это то, что я, похоже, не могу найти способ реализовать это на данный момент, поскольку я не знаю, как долго я должен это откладывать, и я не знаю, как отложить что-то, пока что-то не произойдет, если вы понимаете, что я имею в виду.

3. time.sleep() зависнет графический интерфейс, используйте after() метод

Ответ №1:

Если у вас возникли некоторые проблемы с использованием tkinter, я предлагаю вам сначала попробовать следовать некоторому руководству.

Для вашего кода попробуйте следующее:

 import turtle
import tkinter as tk

def draw():
    n = int(entry.get())
    u = (360 / n) if n != 0 else 0
    for i in range(n):
        t.fd(50)
        t.left(u)


if __name__ == '__main__':
    root = tk.Tk()

    canv = tk.Canvas(root, width=400, height=400)
    canv.pack()

    tcanv = turtle.TurtleScreen(canv)
    t = turtle.RawTurtle(tcanv)

    label = tk.Label(root, text="Sides?")
    label.pack()

    entry = tk.Entry(root)
    entry.pack()

    btn = tk.Button(text="Draw", fg="black", command=draw)
    btn.pack()

    root.mainloop()
  

(Только переупорядочил ваш код и изменил строку var)