Мне нужно сделать программу в python, которая использует функцию на основе * txt-файла. Файл содержит 20 значений x (диапазон x от -10 до 10) в первом столбце и 20 y значений в следующем столбце. Мне удалось создать окно с кнопкой открытия файла, я также нарисовал ось и т. Д. Единственная проблема заключается в том, что значения, считанные из txt-файла, не соответствуют координатам в программе. Это мой код:Графический график в python с использованием tkinter
import tkinter as tk
import tkinter.filedialog
class Program(tk.Frame,tk.Canvas):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
self.kanwa = tk.Canvas(self)
self.kanwa.pack(fill=tk.BOTH, expand=1)
self.initUI()
self.rys_osi()
self.znaczniki()
def initUI(self):
self.parent.title("Program")
self.pack(fill=tk.BOTH, expand=1)
menubar = tk.Menu(self.parent)
self.parent.config(menu=menubar)
fileMenu = tk.Menu(menubar)
fileMenu.add_command(label="Otwórz", command=self.otworz_plik)
menubar.add_cascade(label="Plik", menu=fileMenu)
self.kanwa.create_text(5, 5, anchor=tk.NW, font="Helvetica 18 bold", fill="blue", text="Wykres funkcji") #tytul
self.kanwa.create_text(780, 270, font="Helvetica 14 bold", fill="black", text="0X") #tytul OX
def rys_osi(self):
self.kanwa.create_line(400, 600, 400, 0, arrow=tk.LAST, arrowshape=(13,17,6), width=3) #os y (x0,y0,x1,y1), grubosc 3px
self.kanwa.create_line(0, 300, 800, 300, arrow=tk.LAST, arrowshape=(13,17,6), width=3) #os x, domyslny arrowshape (d1,d2,d3=8,10,3)
def znaczniki(self):
for i in range(21):
x = i * 38
self.kanwa.create_line(x+20,310,x+20,290, width=2) #rysowanie znacznikow na osi x
for j in range(21):
y = j * 27
self.kanwa.create_line(410,y+30,390,y+30, width=2) #rysowanie znacznikow na osi y
def otworz_plik(self):
typ_pliku = [('Pliki tekstowe', '*.txt'), ('Wszystkie pliki', '*')] #domyslny typ pliku - *txt
dlg = tk.filedialog.Open(self, filetypes = typ_pliku)
fl = dlg.show()
if fl != '':
text = self.czytaj_plik(fl)
self.konwersja(text)
def czytaj_plik(self, filename):
f = open(filename, "r")
text = f.read()
return text
def konwersja(self, text): #OPERACJE NA WCZYTANYCH PUNTACH
x = [line.split()[0] for line in text.splitlines()] #podział wiersza na wartości x i y
y = [line.split()[1] for line in text.splitlines()]
x1 = [float(arg) for arg in x] #konwersja x -> float
y1 = [float(arg) for arg in y] #konwersja y -> float
punkty = zip (x1,y1) #punkty (x,y) zzipowane funkcja
arg = max(abs(min(y1)),max(y1)) #maksymalna wartosc y
skala = arg/10 #podziel max wart y przez 10 - uzyskuje podzialke
wart_y = []
for i in range (11): #petla wpisujaca wartosci skali y do listy wart_y
wart_y.append(i) #inicjalizacja listy ???
wart_y[i]=skala*i
wart_y.reverse() #odwrocenie kolejnosci argumentow w liscie
print(x)
print(y)
print (arg,"MAX Y")
print(wart_y)
self.etykiety_x(x)
self.etykiety_y(wart_y)
self.rysuj(x1,y1)
def etykiety_x(self,x):
for i in range(21):
q = i * 38
self.kanwa.create_text(q+15, 320, font="Helvetica 10", fill="black", text=x[i]) #etykiety osi x - po prostu nazywa od stringow
def etykiety_y(self,wart_y):
for i in range(11):
q = i * 27
self.kanwa.create_text(430, q+30, font="Helvetica 10", fill="black", text=wart_y[i]) #etykiety osi y - dodatnie
j = 9
while j >= 0:
u = j * 27
self.kanwa.create_text(430, 570-u, font="Helvetica 10", fill="black", text=wart_y[j]) #etykiety osi y - ujemne
j=j-1
print(j,wart_y[j])
def rysuj(self,x1,y1):
punkty = []
punkty = zip(x1,y1)
self.kanwa.create_line(*punkty, fill='red', width = 3)
def main():
app = tk.Tk()
Program(app)
app.geometry("800x600") #rozmiar okna
app.mainloop()
if __name__ == '__main__':
main()
И файл ТНХ выглядит следующим образом:
-10 150
-9 114
...
10 190
Я очень новичок в кодировании, поэтому я не знаю, как для преобразования значений функции в координаты на экран.
Не поможет вам сейчас, но 'tkinter' болезнен, когда дело доходит до создания математических сюжетов. Вместо этого используйте 'matplotlib': http://matplotlib.org/, по крайней мере для будущих проектов. –
Да, я знаю, но я должен сделать это без использования каких-либо внешних библиотек. –