我已經編寫了一個腳本,它應該根據不同的變量(xa,ya,xb等)計算相交點(xp,yp) yb,xc,yc,xd,yd)並用座標系中的點繪製線段。一般它的工作,但有一個問題。我想在Clickig按鈕「Oblicz」後在Tkinter窗口中顯示我的結果(xp,yp),但執行self.xp.set(XP)
後出現錯誤AttributeError: Entry instance has no attribute 'set'
。它有什麼問題?我如何修改它?如何在窗口中顯示結果(Tkinter) - 運行腳本後出現「AttributeError」
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()
該錯誤似乎不言自明。您正在調用入口小部件上的'set',但入口小部件沒有'set'方法。 –