Ich habe bereits ein Skript geschrieben, das einen Schnittpunkt (xp, yp) basierend auf verschiedenen Variablen (xa, ya, xb, yb, xc, yc, xd, yd) und zeichnen Segmente mit Punkten im Koordinatensystem. Generell funktioniert es, aber es gibt ein Problem. Ich möchte mein Ergebnis (xp, yp) im Fenster Tkinter nach dem Klick auf die Schaltfläche "Oblicz" zeigen, aber nach der Implementierung self.xp.set(XP)
bekomme ich einen Fehler AttributeError: Entry instance has no attribute 'set'
. Was ist daran falsch? Wie kann ich es ändern?Wie zeige ich das Ergebnis im Fenster (Tkinter) - "AttributeError" nach dem Ausführen eines Skripts
from Tkinter import *
import matplotlib.pyplot as plt
import numpy as np
import itertools
class Calculator:
def __init__(self, master):
self.master = master
master.title("Przecinanie prostych")
vcmd = master.register(self.validate) # we have to wrap the command
self.entry = Entry(master, validate="key", validatecommand=(vcmd,
'%P'))
self.zamknij_button = Button(master,
text='Zamknij',command=master.quit)
#draw result**
self.rysuj_button = Button(master, text=' Rysuj ',
command=lambda:self.draw())
#show result**
self.oblicz_button = Button(master, text=' Oblicz ',
command=lambda:self.update())
# LAYOUT ONLY
self.xp = DoubleVar()
self.yp = DoubleVar()
self.xa_label = Label(master, text="XA")
self.xa_label.grid(row=0)
self.ya_label = Label(master, text="YA")
self.ya_label.grid(row=1)
self.xb_label = Label(master, text="XB")
self.xb_label.grid(row=2)
self.yb_label = Label(master, text="YB")
self.yb_label.grid(row=3)
self.xc_label = Label(master, text="XC")
self.xc_label.grid(row=4)
self.yc_label = Label(master, text="YC")
self.yc_label.grid(row=5)
self.xd_label = Label(master, text="XD")
self.xd_label.grid(row=6)
self.yd_label = Label(master, text="YD")
self.yd_label.grid(row=7)
self.e7_label = Label(master, text="XP")
self.e7_label.grid(row=9)
self.e7 = Entry(master, textvariable = self.xp)
self.e7.grid(row = 9, column = 1)
self.e8_label = Label(master, text="YP")
self.e8_label.grid(row=10)
self.e8 = Entry(master, textvariable = self.yp)
self.e8.grid(row = 10, column = 1)
self.zamknij_button.grid(row=11, column=1, sticky=W, pady=5)
self.oblicz_button.grid(row=8, column=1, sticky=W, pady=4)
self.rysuj_button.grid(row=11, column = 2, sticky=W, pady=4)
self.xa = Entry(master)
self.ya = Entry(master)
self.xb = Entry(master)
self.yb = Entry(master)
self.xc = Entry(master)
self.yc = Entry(master)
self.xd = Entry(master)
self.yd = Entry(master)
self.xp = Entry(master)
self.yp = Entry(master)
self.xa.grid(row=0, column=1)
self.ya.grid(row=1, column=1)
self.xb.grid(row=2, column=1)
self.yb.grid(row=3, column=1)
self.xc.grid(row=4, column=1)
self.yc.grid(row=5, column=1)
self.xd.grid(row=6, column=1)
self.yd.grid(row=7, column=1)
self.xp.grid(row=9, column=1)
self.yp.grid(row=10, column=1)
self.xa.insert(10, 0)
self.ya.insert(10, 0)
self.xb.insert(10, 10)
self.yb.insert(10, 10)
self.xc.insert(10, 0)
self.yc.insert(10, 10)
self.xd.insert(10, 10)
self.yd.insert(10, 0)
def validate(self, new_text):
if not new_text: # the field is being cleared
self.xp.set(0)
return True
try:
self.xp.set(int(new_text))
return True
except ValueError:
return False
def update(self):
xa = float(self.xa.get())
ya = float(self.ya.get())
xb = float(self.xb.get())
yb = float(self.yb.get())
xc = float(self.xc.get())
yc = float(self.yc.get())
xd = float(self.xd.get())
yd = float(self.yd.get())
dXAB = xb - xa
dXCD = xd - xc
dXAC = xc - xa
dYAB = yb - ya
dYCD = yd - yc
dYAC = yc - ya
mian = dXAB * dYCD - dYAB * dXCD
t1 = (dXAC * dYCD - dYAC * dXCD)/mian
if mian == 0:
raise Exception('Brak przeciec')
XP = xa + t1 * dXAB
self.xp.set(XP)
print XP
YP = ya + t1 * dYAB
self.yp.set(YP)
print YP
def draw(self):
xa = float(self.xa.get())
ya = float(self.ya.get())
xb = float(self.xb.get())
yb = float(self.yb.get())
xc = float(self.xc.get())
yc = float(self.yc.get())
xd = float(self.xd.get())
yd = float(self.yd.get())
fig = plt.figure()
ax = fig.add_subplot(111)
plt.axis([-2, xd + 2, -2, yb + 2])
t1 = [[xa, ya], [xb, yb]]
t2 = [[xc, yc], [xd, yd]]
plt.plot(
*zip(*itertools.chain.from_iterable(itertools.combinations(t1, 2))),
color='blue', marker='o')
plt.plot(
*zip(*itertools.chain.from_iterable(itertools.combinations(t2, 2))),
color='green', marker='o')
ax.annotate('A', xy=(xa, ya), xytext=(xa-0.7, ya), fontsize=18)
ax.annotate('B', xy=(xb, yb), xytext=(xb - 0.7, yb), fontsize=18)
ax.annotate('C', xy=(xc, yc), xytext=(xc - 0.7, yc), fontsize=18)
ax.annotate('D', xy=(xd, yd), xytext=(xd + 0.3, yd), fontsize=18)
plt.show()
root = Tk()
my_gui = Calculator(root)
root.mainloop()
Der Fehler scheint ziemlich selbsterklärend. Sie rufen 'set' auf einem Eingabe-Widget auf, aber das Eingabe-Widget hat keine' set'-Methode. –