【问题标题】:How can I make a grading button from tkinter entry?如何从 tkinter 条目中制作评分按钮?
【发布时间】:2021-07-09 03:33:48
【问题描述】:

我正在制作一个词汇测试程序,我需要让每个条目都输入答案。但是,我发现制作每个条目的效率非常低,所以我使用for i in range(0,35) 制作条目。但现在我坚持获取每个条目的价值。如何制作一个按钮来收集每个没有名称的条目中的所有.get()

import tkinter
from tkinter import *

window = tkinter.Tk()
container = tkinter.Frame(window)
canvas = tkinter.Canvas(container)
window.title('Rescue word test')
window.geometry('640x480')
window.resizable(True, True)
scrollbar = tkinter.Scrollbar(container, orient="vertical", command=canvas.yview)

#scroll
main_frame = Frame(window)
main_frame.pack(fill=BOTH, expand=1)

my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)

my_scrollbar = tkinter.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)

my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_scrollbar.bind('<Configure>', lambda e: my_canvas.configure(scrollregion= my_canvas.bbox("all")))

second_frame = Frame(my_canvas)

my_canvas.create_window((0,0), window= second_frame, anchor="nw")

def mouse_scroll(event):
    my_canvas.yview_scroll(-1 * int((event.delta / 120)), "units")
my_canvas.bind_all("<MouseWheel>", mouse_scroll)

def getEntry( i ):
    return list( second_frame.children.values() )[ i ]

Day21_eng = ['exquisite', 'acquisition', 'regulate', 'transportation', 'insight', 'straightforward', 'cultivate', 'innovation', 'preserve', 'odor', 'exception', 'munch', 'proclaim', 'slap', 'variability', 'investigate', 'flare', 'outpace', 'genuine', 'plead', 'fossilize', 'toil', 'drastic', 'withhold', 'inanimate', 'clockwise', 'amnesia', 'revive', 'theorize', 'culprit', 'limp', 'worn-out', 'indignity', 'span', 'bribe']
Day21_kor = [['우아한', '정교한', '절묘한'], ['취득', '획득', '습득'], ['규제하다', '통제하다'], ['운송', '운임', '추방'], ['통찰', '통찰력'], ['명확한', '솔직한'], ['경작하다', '기르다', '장려하다', '육성하다'], ['혁신'], ['보전', '보호지', '보호하다', '보존하다'], ['냄새', '악취', '기미', '낌새'], ['예외'], ['우적우적 먹다'], ['선언하다'], ['찰싹 때리다'], ['변화성', '가변성', '변용성'], ['조사하다'], ['불끈 성나게 하다', '이글거리다', '불꽃', '타오름'], ['앞지르다', '속도가 더 빠르다'], ['진짜의', '진품의'], ['탄원하다', '변호하다', '애원하다'], ['고착화하다', '화석화하다'], ['수고', '노고', '힘들게 일하다'], ['급격한', '극단적인'], ['보류하다', '유보하다'], ['생명 없는', '무생물의'], ['시계방향으로'], ['기억상실'], ['부활시키다', '되살아나게 하다'], ['이론화하다'], ['죄인', '범죄자', '장본인'], ['절뚝거리다', '느릿느릿 가다', '기운이 없는','축 처진'], ['닳아빠진', '진부한', '지친'], ['모욕', '무례', '치욕'], ['기간', '폭', '범위', '걸치다', '이르다'], ['뇌물을 주다', '뇌물']]

b = 0
for i in range(0,35):
    lable = Label(second_frame, text= Day21_eng[b])
    lable.grid(column=0, row=b)
    #입력 값 35개
    entry = tkinter.Entry(second_frame, width=30)
    entry.grid(row=b, column=1, sticky='nsew')
    # important to bind each one for access
    entry.bind('<Return>', getEntry)
    b += 1              
b_check = Button(second_frame, text='grade')
b_check.grid(columnspan=2, row=36)

window.mainloop()

如果我按下“评分”按钮,我想制作一个命令来检查每个条目的.get() 是否为inDay21_kor 列表。

【问题讨论】:

  • 您的FrameButtonCanvas 对象定义不正确。使用'tkinter.
  • 我的代码可以正常工作(已修复错误)。你想让我把它贴在这里吗?

标签: python-3.x tkinter tkinter-entry


【解决方案1】:

您可以使用list 来存储Entry 小部件,并在grade 的回调中使用此list

...
def check():
    for i, e in enumerate(entries):
        value = e.get()
        print(value, value in Day21_kor[i])
        # or whatever you want to do

entries = []
for row, item in enumerate(Day21_eng):
    lable = tkinter.Label(second_frame, text=item)
    lable.grid(column=0, row=row)
    #입력 값 35개
    entry = tkinter.Entry(second_frame, width=30)
    entry.grid(row=row, column=1, sticky='nsew')
    # important to bind each one for access
    entry.bind('<Return>', getEntry)
    entries.append(entry) # save 'entry' into list

b_check = tkinter.Button(second_frame, text='grade', command=check)
b_check.grid(columnspan=2, row=36)

请注意,您的代码中还有其他问题:

  • 未使用的小部件:containercanvasscrollbar
  • 应该在second_frame 上绑定&lt;Configure&gt; 而不是my_scrollbar
  • 执行getEntry() 时出现异常。你实际上想在这个函数中做什么?

【讨论】:

    【解决方案2】:

    对@acw1668 代码稍作改动会将结果输出到shell 并生成一个结果字典——称为result

    result = dict()
    
    def check():
        global result    
        for i, e in enumerate(entries):
            name = description[ i ][ 'text' ]
            value = e.get()
            print( name, value )
            result[ name ] = value
    
    entries = []
    description = []
    for row, item in enumerate(Day21_eng):
        lable = tkinter.Label(second_frame, text=item)
        lable.grid(column=0, row=row)
        #입력 값 35개
        entry = tkinter.Entry(second_frame, width=30)
        entry.grid(row=row, column=1, sticky='nsew')
        description.append( lable )
        entries.append(entry)
    
    b_check = tkinter.Button(second_frame, text='grade', command=check)
    b_check.grid(columnspan=2, row=36)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多