이 첨부 된 코드와 관련된 두 가지 질문이 있습니다. 이 코드는 50 명 (또는 그 이상) 학생의 출석을 관리해야하는 프로젝트의 일부입니다.
이 코드 조각을 실행하면 레이블 프레임 (예 : Attendance_Frame) 내에 추가 공백 (캔버스 일 수 있음)이 있음을 알 수 있습니다. 내가 원했던 것은 여분의 공백이 없어야하고 스크롤바가 맨 오른쪽에있는 대신 레이블이 끝나는 위치에 있어야한다는 것입니다. 나는 내 질문에 대한 답을 찾고 비슷한 사례를 보았습니다. 그러나 그곳에서 그 사람은 프레임이 캔버스 크기로 확장되기를 원했습니다. 링크 ( Tkinter : 캔버스 창에서 프레임을 가져와 캔버스 크기로 확장하는 방법은 무엇입니까? ). 그러나 제 경우에는 캔버스 크기가 프레임 크기와 같기를 원합니다 (프레임이 캔버스 안에 있지만)
내가 원하는 또 다른 것은 모든 확인란이 처음에 '선택'되어야한다는 것 (현재 상태 표시)과 무작위 확인란의 선택을 취소 할 때 (결석을 표시하기 위해), '제출'버튼을 클릭합니다 (아직 창 하단), 첫 번째 요소로 '입력 한 날짜'가있는 목록과 다른 요소로 2018-MC-XX와 같은 롤 번호가 포함 된 목록이 표시됩니다. 예 : ['01 / 08 / 2020 ','2018-MC-7 ','2018-MC-11 ','2018-MC-23 ','2018-MC-44 ']. 실제로 내 계획은 내가 목록을 얻을 때 내가 쉽게 텍스트 파일에 쓸 것입니다.
from tkinter import *
from tkcalendar import DateEntry
root = Tk()
root.geometry('920x600+270+50')
root.minsize(920,600)
Attendance_frame = Frame(root) ### Consider it a Main Frame
Attendance_frame.pack()
attendaceBox = LabelFrame(Attendance_frame, text = 'Take Attendance', bd = 4, relief = GROOVE, labelanchor = 'n',font = 'Arial 10 bold', fg = 'navy blue', width = 850, height = 525) # A Label Frame inside the main frame
attendaceBox.pack_propagate(0)
attendaceBox.pack(pady = 15)
dateFrame = Frame(attendaceBox) # A small frame to accommodate date entry label & entry box
dateFrame.pack(anchor = 'w')
font = 'TkDefaultFont 10 bold'
date_label = Label(dateFrame, text = 'Enter Date : ', font = font).grid(row = 0, column = 0, sticky = 'w', padx = 10, pady = 10)
date_entry = DateEntry(dateFrame, date_pattern = 'dd/mm/yyyy', showweeknumbers = FALSE, showothermonthdays = FALSE)
date_entry.grid(row = 0, column = 1, sticky = 'w')
noteLabel = Label(attendaceBox, text = 'Note: Uncheck the boxes for absentees').pack(anchor = 'w', padx = 10, pady = 5)
canvas = Canvas(attendaceBox, borderwidth=0, background="#ffffff")
checkFrame = Frame(canvas, width = 100, height = 50)
vsb = Scrollbar(canvas, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=vsb.set)
vsb.pack(side="right", fill="y")
canvas.pack(side="left", fill="both", expand=True)
canvas.pack_propagate(0)
canvas.create_window((4,4), window=checkFrame, anchor="nw")
def onFrameConfigure(canvas):
'''Reset the scroll region to encompass the inner frame'''
canvas.configure(scrollregion=canvas.bbox("all"))
checkFrame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas))
for i in range(0,51): # A loop to create Labels of students roll numbers & names
c = Checkbutton(checkFrame, text = f"{'2018-MC-'+str(i+1)} Student {i+1}")
c.grid(row = i, column = 0, padx = 10, sticky = 'w')
mainloop()
항목의 세로 목록을 만드는 경우 캔버스 내부에 프레임을 사용할 필요가 없습니다. 내부 프레임은 불필요한 복잡성을 추가합니다. 대신 캔버스에 create_window
.
scrollregion
스크롤바가 스크롤 할 가상 캔버스의 양을 알 수 있도록 속성 을 구성해야합니다 .
마지막으로, 그것들을 선택하려면 각 체크 버튼에 변수를 할당하고 값이 적절한 값인지 확인해야합니다. 기본적으로 체크 버튼은 값 0과 1을 사용하므로 변수를 1로 설정하면 선택됩니다.
vars = []
for i in range(0,51):
var = IntVar(value=1)
vars.append(var)
x0, y0, x1, y1 = canvas.bbox("all") or (0,0,0,0)
c = Checkbutton(canvas, text = f"{'2018-MC-'+str(i+1)} Student {i+1}", variable=var)
canvas.create_window(2, y1+4, anchor="nw", window=c)
canvas.configure(scrollregion=canvas.bbox("all"))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다