2017-03-31 179 views
-1

我正在創建一個簡單的GUI程序來管理優先級。我在從另一個函數中訪問函數時遇到麻煩。在我的程序中,我試圖創建一個GuiPart類的實例,然後調用g.addItem,但它似乎不能像那樣工作。我得到一個錯誤:如何從另一個函數內調用函數?

/usr/bin/python3.5 /home/cali/PycharmProjects/priorities/priorities.py 
Traceback (most recent call last): 
File "/home/cali/PycharmProjects/priorities/priorities.py", line 70, in > <module> 
    g.display() 
File "/home/cali/PycharmProjects/priorities/priorities.py", line 39, in > display 
    command = g.addItem) 
File "/usr/lib/python3.5/tkinter/__init__.py", line 2077, in grid_configure 
    + self._options(cnf, kw)) 
_tkinter.TclError: bad option "-command": must be -column, -columnspan, -in, > -ipadx, -ipady, -padx, -pady, -row, -rowspan, or -sticky 

這裏是我做了什麼:

# priorities.py 
# GUI program to manage priorities 

from tkinter import * 

class Priority: 

    def __init__(self, subject, priority): 
     self.subject = subject 
     self.priority = priority 

    def subject(self): 
     return self.subject 

    def priority(self): 
     return self.priority 


class GuiPart: 

    def __init__(self): 
     self.root = self.createWindow() 

    def createWindow(self): 

     root = Tk() 
     root.resizable(width = False, height = False) 
     root.title("Priorities") 

     return root 

    def createWidgets(self): 

     listBox = Listbox().grid(row=1) 

     buttonAdd = Button(text = "Add").grid(row = 2, 
            column = 0, 
            sticky = W, 
            command = g.addItem) 

     buttonRemove = Button(text="Remove").grid(row = 2, 
            column = 0, 
            sticky = W, 
            command = g.removeItem) 

     buttonEdit = Button(text="Edit").grid(row = 2, 
           column = 0, 
           sticky = E, 
           command = g.editItem) 

     textBox = Text().grid(row = 3) 

    def addItem(self, item): 
     item = Priority(item.subject, item.priority) 
     item.subject = g.textBox.get("1.0", 'end-1c') 

     g.listBox.insert(END, self) 

    def removeItem(self): 
     pass 

    def editItem(self): 
     pass 

class Client: 
    pass 

if __name__ == "__main__": 
    g = GuiPart() 
    g.createWidgets() 
    g.root.mainloop() 
+1

'addItem'需要一個參數,你不提供它由它的外觀 – ybce

+2

你正在實例化一個'GuiPart'對象爲'g',但你也可以參考類中的'g'。他們應該是'自我',不是? – ryugie

回答

2

讓我們來看看你的代碼的一部分...

buttonAdd = Button(text = "Add").grid(row = 2, 
           column = 0, 
           sticky = W, 
           command = g.addItem) 

這裏的主要問題是:command是對Button()參數構造函數,而不是.grid()方法。這就是你目前的錯誤來自哪裏。

第二個問題是您分配給buttonAdd的值是.grid()(始終爲None)的結果,而不是按鈕本身。如果你真的需要爲以後使用(通常,你不這樣做)的按鈕的引用,這必須被分成兩個語句:

buttonAdd = Button(text = "Add", command = g.addItem) 
    buttonAdd.grid(row = 2, 
        column = 0, 
        sticky = W) 
+0

非常感謝,我不能相信我錯過了這一點。 – wraith46

+0

如果我沒有對該按鈕的引用,那麼應該如何指向我想要網格化的按鈕? – wraith46

+0

你可以在一行中完成(就像你原來所做的那樣),只是不要費心將結果賦值給一個變量。 – jasonharper

0

看到這個:

buttonAdd = Button(text = "Add").grid(row = 2, 
          column = 0, 
          sticky = W, 
          command = g.addItem) 
#         ^^^^^^^^^ 

buttonRemove = Button(text="Remove").grid(row = 2, 
          column = 0, 
          sticky = W, 
          command = g.removeItem) 
#         ^^^^^^^^^^^^ 

buttonEdit = Button(text="Edit").grid(row = 2, 
          column = 0, 
          sticky = E, 
          command = g.editItem) 
#         ^^^^^^^^^^ 

您是調用函數你他們分配。 爲了調用它們,你必須傳遞參數給它們。

一個小例子解釋發生了什麼:

>>> id(print) 
1769760 
>>> some_var = print 
>>> id(some_var) 
1769760 
>>> some_var 
<built-in function print> 
>>> some_var('we assigned the built-in function "print" to the variable 
... some_var') 
we assigned the built-in function "print" to the variable some_var 
+1

OP不想調用這些函數 - 它們被設置爲在單擊按鈕時被調用。 – jasonharper

+0

@jasonharper你是對的!標題上寫着「call」,wraith說他想「打電話」......所以我專注於「打電話」一個功能:-D – DahliaSR

相關問題