2016-01-21 61 views
0

我使用python 3.5.1進行Python類編程。Python檢查按鈕

分配是:

(選擇的幾何圖形)編寫繪製一個矩形或橢圓形,如圖9.23的程序。用戶從單選按鈕中選擇一個圖形,並通過選擇一個檢查按鈕來指定是否填充該圖形。

from tkinter import * 

class geometricFig: 
    def __init__(self): 
     window = Tk() 
     window.title("Geometric Figures") 

     self.canvas = Canvas(window, width = 200, height = 100, bg = "white") 
     self.canvas.pack() 

     frame = Frame(window) 
     frame.pack() 
     self.v1 = StringVar() 
     rbRect = Radiobutton(frame, text = "Rectangle", command = self.displayRect, variable = self.v1, value = '1') 
     rbOval = Radiobutton(frame, text = "Oval", command = self.displayOval, variable = self.v1, value = '2') 
     self.v2 = StringVar() 
     cbtFill = Checkbutton(frame, text = "Fill", command = self.processFill, variable = self.v2) 

     rbRect.grid(row = 1, column = 1) 
     rbOval.grid(row = 1, column = 2) 
     cbtFill.grid(row = 1, column = 3) 

     window.mainloop() 

    def displayRect(self): 
     self.canvas.delete("rect", "oval") 
     self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect") 
    def displayOval(self): 
     self.canvas.delete("rect", "oval") 
     self.canvas.create_oval(10, 10, 190, 90, tags = "oval") 
    def processFill(self): 
     if self.v1.get() == '1': 
      self.canvas.delete("rect", "oval") 
      self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect", fill = "red") 
     elif self.v1.get() == '2': 
      self.canvas.delete("rect", "oval") 
      self.canvas.create_oval(10, 10, 190, 90, tags = "oval", fill = "red") 
     else: 
      self.canvas.delete("rect", "oval") 

geometricFig() 

我能夠做的是創建窗口,並有單選按鈕繪製矩形和橢圓形。我也能夠實現檢查按鈕繪製一個填充的矩形或橢圓形,這取決於哪個單選按鈕被勾選。

但是,當我建立程序時,它啓動程序,所有無線電和檢查按鈕填充in。我必須取消選中程序的所有內容才能開始正常工作。另外,當我取消選中填充按鈕時,它不會填充形狀,但會在畫布上留下填充的形狀。

我能做些什麼來解決這些問題?

回答

1

在進入主循環之前,嘗試顯式地爲您的StringVars設置值。

self.v1.set("1") 
self.v2.set("0") 

取消勾選「填充」按鈕不會導致中空形狀要被繪製,因爲中空形狀時displayRectdisplayOval僅繪製,但你是不是從內調用任何其中之一processFill。我建議只有一個函數可以作爲你所有三個小部件的回調函數。

self.v1 = StringVar() 
    rbRect = Radiobutton(frame, text = "Rectangle", command = self.optionChanged, variable = self.v1, value = '1') 
    rbOval = Radiobutton(frame, text = "Oval", command = self.optionChanged, variable = self.v1, value = '2') 
    self.v2 = StringVar() 
    cbtFill = Checkbutton(frame, text = "Fill", command = self.optionChanged, variable = self.v2) 

#later on in the class definition... 
def optionChanged(self): 
    self.canvas.delete("rect", "oval") 
    color = "white" if self.v2.get() == "0" else "red" 
    if self.v1.get() == '1': 
     self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect", fill = color) 
    else: 
     self.canvas.create_oval(10, 10, 190, 90, tags = "oval", fill = color)