холст tkinter: рисование полинома некорректно - PullRequest
0 голосов
/ 18 февраля 2020

Я довольно новичок в python, и я должен завершить задачу написания кода, который dr aws является полиномом.

Код работает, но это dr aws полином немного неправильно: он немного растягивает его по оси х

Кто-нибудь может знать, как это можно исправить? Моя ошибка, вероятно, заключается в функции drawPolynomial().

import tkinter as tk

# Initialisation and canvas creation
window = tk.Tk()
cnvs = tk.Canvas(window, width=500, height=500)
cnvs.grid(row=6, columnspan=1500)

# Empty row for aesthetics
emptyrow1 = tk.Label(window)
emptyrow1.grid(row=5)

# Create the inputs and text for the polynomyal:
# □x^6+□x^5+□x^4+□x^3+□x^2+□x+□
entry1 = tk.Entry(window, width=3)
entry1.grid(row=0, column=0)
entry2 = tk.Entry(window, width=3)
entry2.grid(row=0, column=2)
entry3 = tk.Entry(window, width=3)
entry3.grid(row=0, column=4)
entry4 = tk.Entry(window, width=3)
entry4.grid(row=0, column=6)
entry5 = tk.Entry(window, width=3)
entry5.grid(row=0, column=8)
entry6 = tk.Entry(window, width=3)
entry6.grid(row=0, column=10)
entry7 = tk.Entry(window, width=3)
entry7.grid(row=0, column=12)
txt1 = tk.Label(window, text="x^6 +")
txt1.grid(row=0, column=1)
txt2 = tk.Label(window, text="x^5 +")
txt2.grid(row=0, column=3)
txt3 = tk.Label(window, text="x^4 +")
txt3.grid(row=0, column=5)
txt4 = tk.Label(window, text="x^3 +")
txt4.grid(row=0, column=7)
txt5 = tk.Label(window, text="x^2 +")
txt5.grid(row=0, column=9)
txt6 = tk.Label(window, text="x +")
txt6.grid(row=0, column=11)

# Empty row for aesthetics
emptyrow2 = tk.Label(window)
emptyrow2.grid(row=1)

# Create inputs and text for definition range:
# □<x<□
entry8 = tk.Entry(window, width=3)
entry8.grid(row=2, column=4)
txt8 = tk.Label(window, text="< x <")
txt8.grid(row=2, column=5)
entry9 = tk.Entry(window, width=3)
entry9.grid(row=2, column=6)

# Empty row for aesthetics
emptyrow3 = tk.Label(window)
emptyrow3.grid(row=3)


def coordsys():  # Draw the coordinate system background
    cnvs.create_rectangle(0, 0, 500, 500, fill="light grey")
    cnvs.create_line(50, 240, 50, 260, fill="grey")
    cnvs.create_line(100, 240, 100, 260, fill="grey")
    cnvs.create_line(150, 240, 150, 260, fill="grey")
    cnvs.create_line(200, 240, 200, 260, fill="grey")
    cnvs.create_line(300, 240, 300, 260, fill="grey")
    cnvs.create_line(350, 240, 350, 260, fill="grey")
    cnvs.create_line(400, 240, 400, 260, fill="grey")
    cnvs.create_line(450, 240, 450, 260, fill="grey")

    cnvs.create_line(240, 50, 260, 50, fill="grey")
    cnvs.create_line(240, 100, 260, 100, fill="grey")
    cnvs.create_line(240, 150, 260, 150, fill="grey")
    cnvs.create_line(240, 200, 260, 200, fill="grey")
    cnvs.create_line(240, 300, 260, 300, fill="grey")
    cnvs.create_line(240, 350, 260, 350, fill="grey")
    cnvs.create_line(240, 400, 260, 400, fill="grey")
    cnvs.create_line(240, 450, 260, 450, fill="grey")

    cnvs.create_line(0, 250, 500, 250, fill="grey")
    cnvs.create_line(250, 0, 250, 500, fill="grey")


coordsys()


def drawPolynomial():  # Draw the polynomial
    coordsys()  # Reset the coordinate system
    a, b, c, d, e, f, g, xz, xk = getEntries()  # Get all the entries' values // xz = start, xk = end
    x = xz
    y = 0
    x0 = x
    y0 = y
    while xz < xk:
        x = xz
        y = -(a * x ** 6 + b * x ** 5 + c * x ** 4 + d * x ** 3 + e * x ** 2 + f * x + g)
        cnvs.create_line(100 * x0 + 250, 100 * y0 + 250, 100 * x + 250, 100 * y + 250)
        x0 = x
        y0 = y
        xz += 0.01


def getEntries():  # Get all the entries' values function
    # If blank -> 0, else get the value from the entry
    if entry1.get() == "":
        a = 0
    else:
        a = eval(entry1.get())
    if entry2.get() == "":
        b = 0
    else:
        b = eval(entry2.get())
    if entry3.get() == "":
        c = 0
    else:
        c = eval(entry3.get())
    if entry4.get() == "":
        d = 0
    else:
        d = eval(entry4.get())
    if entry5.get() == "":
        e = 0
    else:
        e = eval(entry5.get())
    if entry6.get() == "":
        f = 0
    else:
        f = eval(entry6.get())
    if entry7.get() == "":
        g = 0
    else:
        g = eval(entry7.get()) * 0.5
    if entry8.get() == "":  # If blank -> -5, else get the value from the entry
        xz = -5
    else:
        xz = int(entry8.get())
    if entry9.get() == "":  # If blank -> 5, else get the value from the entry
        xk = 5
    else:
        xk = int(entry9.get())
    return a, b, c, d, e, f, g, xz, xk


bttn = tk.Button(window, text="Draw", command=drawPolynomial)
bttn.grid(row=4, column=5)

window.minsize(500, 500)
window.maxsize(700, 700)
tk.mainloop()

1 Ответ

1 голос
/ 19 февраля 2020

Благодаря jasonharper, вот ответ:

Ваш график просто увеличен в 2 раза по сравнению с графиком из desmos; ваши отметки делятся с интервалом 0,5, а не 1. Измените эти 100 в drawPolynomial () на 50 (чтобы соответствовать количеству пикселей между отметками), и я считаю, что вы получите точное совпадение.
- jasonharper

...