Python 刷新 GUI 以创建另一个输出

Python Refresh GUI to create another output

我对 Python 很陌生。我正在尝试创建一个从 Smartsheet sheet 打印数字然后删除它的应用程序。问题是我只能打印一次,一旦我再次点击 "Create" 按钮,它就会给出错误信息。我相信当我再次单击 "Create" 按钮时,它 returns 从 sheet 中删除的号码。谢谢!

{"response": {"statusCode": 404, "reason": "Not Found", "content": {"detail": {"ids": [3462338204985220], "type": "row"}, "errorCode": 1006, "message": "Not Found", "refId": "hcuqkioxqz46"}}}

这里是存储一串数字的sheet:

这是我的代码:

#Smartsheet client access token
smartsheet_client = smartsheet.Smartsheet('access token')

#Order Dashboard sheet ID
MySheet=smartsheet_client.Sheets.get_sheet(sheet_id)


def conceptnum():
    n=1
    for Myrow in MySheet.rows:
        while n==1:
            for Mycell in Myrow.cells:
                row_ids=Myrow.id
                label1['text']=int(Mycell.value)
                label2['text']="Your concept number is created" 
                smartsheet_client.Sheets.delete_rows(
                sheet_id,                       # sheet_id
                row_ids)     # row_ids
            n=n-1


Height=100
Width=200

root=tk.Tk()

canvas=tk.Canvas(root, height=Height, width=Width)
canvas.pack()

frame=tk.Frame(root, bg="grey")
frame.place(relx=0.05, rely=0.3, relwidth=0.9, relheight=0.4)

button=tk.Button(root, text="Create",command=conceptnum)
button.pack(side='bottom')

label1=tk.Label(frame,font=15)
label1.place(relx=0.1, rely=0.1,relwidth=0.8, relheight=0.8)

label2=tk.Label(root)
label2.place(relwidth=1,relheight=0.2)

root.mainloop()  

如当前所写,您的 conceptnum() 函数正在执行此操作:

for each row in the sheet -> 
  for each cell in the current row ->
    ...
    delete the current row

因此,如果您的 sheet 包含不止一列,您的脚本将:

  • 获取 sheet
  • 的第一行
  • 获取正在处理的行的第一个单元格的值
  • 从 sheet
  • 中删除行
  • 获取正在处理的行的第二个单元格的值
  • 从 sheet 中删除行 -> 此 删除行 请求(以及对正在处理的行中的每个附加 column/cell 的后续请求) return 会出现 "Not Found" 错误——因为该行不再存在于 sheet 中——您在读取第一个单元格值后将其删除。

假设您的 objective 是读取 sheet 第一行第一个单元格中的值,然后从 sheet 中删除该行,这里有一个函数这样做——请注意,我已经更改了函数名称和变量名称以遵循 Python 样式约定(带下划线的小写):

def concept_num():

    # get sheet
    my_sheet = smartsheet_client.Sheets.get_sheet(sheet_id)

    # initialize row_id
    row_id = None

    for row in my_sheet.rows:
        # get the ID of the current (first) row
        row_id = row.id

        # get the Cell object for the first cell of the current (first) row
        cell = row.cells[0]

        # set labels
        label1['text'] = int(cell.value)
        label2['text'] = 'Your concept number is created' 

        # exit the 'for' loop (so that only the first row is processed)
        break

    # delete the row that was just processed
    if row_id != None:
        smartsheet_client.Sheets.delete_rows(sheet_id, row_id)
    else:
        label1['text'] = 'n/a'
        label2['text'] = 'Concept number not found.'

编辑 2020 年 4 月 13 日:

您需要在每次 concept_num 函数运行时获取 sheet -- 这样 my_sheet 反映 sheet 的当前内容(即,不再包含之前函数 运行 时删除的行)。我相应地更新了上面的代码片段(即,在 concept_num 函数的顶部添加了 get sheet 调用)。我还在代码段的末尾添加了代码(使用 else),以便在 Create 按钮时 sheet 不包含更多数字时相应地更新标签被点击。