2017-11-18 70 views
-1

我已經編寫了一個腳本,它應該根據不同的變量(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() 
+0

該錯誤似乎不言自明。您正在調用入口小部件上的'set',但入口小部件沒有'set'方法。 –

回答

2

這個問題似乎是您最初創建self.xpself.ypDoubleVar對象:

 self.xp = DoubleVar() 
     self.yp = DoubleVar() 

但是,你以後有Entry部件替換它們:

 self.xp = Entry(master) 
     self.yp = Entry(master) 

什麼你可能是想爲Entry小部件創建單獨的對象,並將它們連接起來p來self.xpself.yp,通過替換上面的最後兩行以下:

 self.xp_entry = Entry(master, textvariable=self.xp) 
     self.yp_entry = Entry(master, textvariable=self.yp) 

您還需要調用替換對self.xp.gridself.yp.gridself.xp_entry.grid等效電話和self.yp_entry.grid,即:

 self.xp_entry.grid(row=9, column=1) 
     self.yp_entry.grid(row=10, column=1) 

一旦我對代碼進行了這些更改,它似乎就可以工作,因爲我可以單擊'Oblicz'按鈕,它將執行一些計算並更改XPYP的值ext字段而不是引發異常。

+0

這是我錯過了。現在一切正常。謝謝! – kwak

相關問題