>source

실행하고 더 작게 만들 때 전체를 스크롤하는 데 문제가 있습니다. 제대로 스크롤되지만 필드 만들기 버튼을 클릭하면 모든 필드를 보기 위해 스크롤할 수 없습니다. 내가 작업하고 있는 다른 기능에 의해 생성될 잠재적으로 수천 개의 질문을 스크롤할 수 있도록 그것을 얻으려고 노력하고 있지만 백엔드 정보에 대한 작업을 계속하기 전에 인터페이스가 작동하기를 원했습니다.

from tkinter import *
from tkinter import ttk
class Form_Data:
    Text_entry= None
    fields= ['First Name', 'Last Name', 'DOB', 'Email','Contact', 'Last Name', 'DOB', 'Email','Contact', 'Last Name', 'DOB', 'Email','Contact', 'Last Name', 'DOB', 'Email','Contact']
    values= []
    directory= ""
    Form= None
    def get_directory(self):
        return self.directory
    def set_directory(self, Folder):
        self.directory= Folder
    def get_fields(self):
        return self.fields
    def form_set(self, form):
        self.Form= form
def fetch(entries):
   for entry in entries:
      field= entry[0]
      text= entry[1].get()
      print('%s: "%s"' % (field, text))
def makeform(root, Data):
    if Data.Form != None:
        for item in Data.Form:
            item[1].destroy()
            Data.Form== None
        for item in Data.Text_entry:
            item[0].destroy()
            item[1].destroy()
            Data.Text_entry== None
            #item.entry.delete(0, 'end')
    entries= []
    entriestext= []
    for field in Data.fields:
      row= Frame(root)
      lab= Label(row, width=15, text=field, anchor='w')
      ent= Entry(row)
      row.pack(side=TOP, fill=X, padx=5, pady=5)
      lab.pack(side=LEFT)
      ent.pack(side=RIGHT, expand=YES, fill=X)
      entries.append((field, ent))
      entriestext.append((row, lab))
    root.pack(side=TOP, fill=X, padx=5, pady=5)
    sb= Scrollbar()
    #sb.pack(side= RIGHT, fill= Y)
    #sb.config( command= rows.yview, background= 'bisque' )
    Data.Text_entry= entriestext
    Data.Form= entries
    print(Data.Form)
if __name__== '__main__':
    root= Tk()
    root.title('Learn To Code at Codemy.com')
    root.geometry("500x400")
    Data= Form_Data
    # Create A Main Frame
    main_frame= Frame(root)
    main_frame.pack(fill=BOTH, expand=1)
    # Create A Canvas
    my_canvas= Canvas(main_frame)
    my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
    # Add A Scrollbar To The Canvas
    my_scrollbar= ttk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
    my_scrollbar.pack(side=RIGHT, fill=Y)
    # Configure The Canvas
    my_canvas.configure(yscrollcommand=my_scrollbar.set)
    my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion= my_canvas.bbox("all")))
    # Create ANOTHER Frame INSIDE the Canvas
    second_frame= Frame(my_canvas)
    # Add that New frame To a Window In The Canvas
    my_canvas.create_window((0,0), window=second_frame, anchor="nw")
    b1= Button(second_frame, text='Make Field',command=(lambda: makeform(second_frame, Data)))
    b1.pack(side=TOP, padx=5, pady=10)
    b3= Button(second_frame, text='Get Variables',command=(lambda : fetch(Data.Form)))
    b3.pack(side=TOP, padx=5, pady=10)
    b2= Button(second_frame, text='Quit', command=root.quit)
    b2.pack(side=TOP, padx=5, pady=10)
    root.mainloop()

캔버스에 항목을 추가할 때마다 캔버스의 스크롤 영역을 업데이트해야 합니다. 현재는 Canvas 자체의 크기가 조정될 때만 그렇게 하고 있습니다.

jasonharper2022-01-15 09:00:14

스크롤 영역을 업데이트하려면 my_canvas 대신 second_frame에서 를 바인딩해야 합니다.

acw16682022-01-15 09:00:14
  • 이전 java : Log4j ThreadContext MultiThread가 상속하지 않습니다.
  • 다음 lit : 켜짐: 간단한 버튼 클릭으로 반응 속성을 변경해도 다시 렌더링되지 않습니다.