2012-07-04 3 views
3

값을 얻기 위해 textvariable에 대한 목록 옵션을 넣은 다음 엔트리 상자가 있습니다.기본 텍스트 및 목록 textvariable 엔트리 위젯 Tkinter

그러나 회색 글 텍스트, '값 1, 값 2 등 ...'과 같이 각 상자에 어떤 값이 필요한지 보여주기 위해 배경에 기본 텍스트를 넣을 수 있는지 궁금합니다.

self.numbers = [StringVar() for i in xrange(self.number_boxes) ] #Name available in global scope.  
box=Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i]) 

나는 상자 안에 마우스 클릭에 '하면 textVariable'아마 뭔가 변화를 추가 할 수 있습니다 또는 단순히 또 다른하면 textVariable 또는 기본 텍스트를 설정하는 텍스트를 추가 할 수 있습니까? here을 설명

self.box = [] 

    for i in xrange(self.number_boxes): 

     self.clicked = False 
     self.box.append(Entry(self.frame_table,bg='white',borderwidth=0, width=10, justify="center", textvariable=self.numbers[i], fg='grey')) 
     self.box[i].grid(row=row_list,column=column+i, sticky='nsew', padx=1, pady=1) 
     self.box[i].insert(0, "Value %g" % float(i+1)) 
     self.box[i].bind("<Button-1>", self.callback) 
+0

감사합니다. 나는 팩이나 표를 목록과 함께 사용할 수 없다. = S – user2063

+0

좋아, 나는 그것을 가지고 있지만 콜백의 첫 번째 상자와 함께 작동하는 것 같습니다. 내가 줄을 추가 할 때 상자를 사용할 수 없다. 다른 것들은 모두 괜찮다. 나는 '범위를 벗어난 목록'을 덧붙여서 같은 오류를 얻는다. – user2063

+0

콜백 함수에'i'를 전달할 수 있도록 lamba 함수를 배워야합니다. 콜백은 함수 정의에서'def callback (event, i) :'그리고 콜백 본문의'box [i]'에서 입력 매개 변수로'i'를 받아들이도록 바뀔 것입니다. lamba 함수의 예를 보려면 stackoverflow를 검색하십시오. 행운을 빌어 요. – gary

답변

4

Entry 위젯에 기본 텍스트를 넣어하기 위하여는, 당신은 insert() 방법을 사용할 수 있습니다.

box.insert(0, "Value 1") # Set default text at cursor position 0. 

이제 사용자가 상자 안에 마우스 클릭을 수행 한 후 box의 내용을 변경하기 위해, 당신은 바인드Entry 객체에 이벤트를해야합니다. 예를 들어, 다음 코드는 클릭 할 때 상자의 내용을 삭제합니다. (당신은 이벤트와 바인딩에 대해 읽을 수 있습니다 here.) 아래에서 나는 이것의 전체 예제를 보여줍니다.

상자의 텍스트를 삭제하면 첫 번째 클릭 (즉, 기본 내용을 삭제할 때)에만 유용하기 때문에 클릭했는지 여부를 추적하는 글로벌 플래그 clicked을 만들었습니다.

from tkinter import Tk, Entry, END # Python3. For Python2.x, import Tkinter. 

# Use this as a flag to indicate if the box was clicked. 
global clicked 
clicked = False 

# Delete the contents of the Entry widget. Use the flag 
# so that this only happens the first time. 
def callback(event): 
    global clicked 
    if (clicked == False): 
     box[0].delete(0, END)   # 
     box[0].config(fg = "black") # Change the colour of the text here. 
     clicked = True 

root = Tk() 
box = []        # Declare a list for the Entry widgets. 

box.append(Entry(fg = "gray"))  # Create an Entry box with gray text. 
box[0].bind("<Button-1>", callback) # Bind a mouse-click to the callback function. 
box[0].insert(0, "Value 1")   # Set default text at cursor position 0. 

box.append(Entry(fg = "gray"))  # Make a 2nd Entry; store a reference to it in box. 
box[1].insert(0, "Value 2") 

box[0].pack()       # 
box[1].pack() 

if __name__ == "__main__": 
    root.mainloop() 
+0

고마워요! 이것이 다른 입력 'textvariable'과 함께 작동합니까? 콜백의 내용을 삭제 한 후 box [ "textvariable"] = self.numbers [i]를 삽입 할 수 있습니까, 아니면 작동하지 않겠습니까? – user2063

+0

또한 내 코드에 통합 했으므로 표를 사용하고 있지만 상자 안쪽을 클릭해도 아무런 변화가 없습니다. 나는 수업과 자기를 사용 해왔다. 그래서 나는 self.box를 사용했다. textvariable은 여전히 ​​작동하는 것 같습니다. 또한 콜백에서 삽입 된 텍스트의 색상을 검정색으로 다시 간단하게 변경할 수 있습니까? – user2063

+0

저는 실제로 클래스에서 그것을 바로 잡을 수 있었고 그것은 일반적인 인스턴스 self.clicked처럼 작동합니다. 그러나 나는 루프를 사용하여 여러 개의 입력 상자를 만들었고 마지막 하나에만 영향을 미친다는 문제가 있습니다. ('분리 된'상자를 어떻게 만들지 알지 못합니까?) – user2063

관련 문제