Aoeso 2023-02-26 19:32 采纳率: 21.1%
浏览 148
已结题

Python 运行时间久了,def中的部分代码不执行,但是可以显示结果

用的python3.11
情况1:

from 查询全部待打印标签 import get_all_labels

def click_button(print_num):
    global text
# 问题在这里,调用了外部get_all_labels函数,在tkinter窗口打开一段时间后,再点击这个按钮,他不会运行这个函数了,直接快递的就return 
    trade_no_num = get_all_labels(print_num=print_num)
    text.insert(tk.END, f'本次打印了{trade_no_num}笔订单标签 \t{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')

def thread_it(func, *args):
    t = threading.Thread(target=func, args=args)
    t.Daemon = True
    t.start()


Print_all_Button = tk.Button(root, text='全部标签打印', bg='#7CCD7C', width=20, height=5,
                             command=lambda: thread_it(click_button, 2))
Print_all_Button.pack()
text = tk.Text(root)
text.pack()
root.mainloop()

运行的结果:

img

情况2:

import hashlib
import urllib.parse
import time
from datetime import datetime, timedelta
import jsonpath
import openpyxl
import requests
import win32com.client



def print_label(trade_no, print_num):

    url_path = 'erp/opentrade/list/trades'

    query_time = get_time(back_6_day.year, back_6_day.month, back_6_day.day, tomorow.year, tomorow.month,
                          tomorow.day)
    # print(query_time)
    data = {
        '_app': appkey,
        '_t': _t,
        # 'bill_code': 'XD220808000014',
        "pay_time": query_time[0],
        'end_time': query_time[1],
        'limit': '200',
        'page': '1',
        'trade_status': '1,2,3,4',
        'is_split': '0'

    }

    _sign = hash_md5(joint(data, secretkey))

    data['_sign'] = _sign
    try:
        res = requests.post(url + url_path, data=data)
        # print(res.json())
        if res.status_code == 200:
            # print('post请求结果:', res.json())

            # 提取数据
            data = jsonpath.jsonpath(res.json(), '$..data')
            # print(data)
            data_list = []

            for i in data[0]:
                single_list = dict.fromkeys(
                    ['平台', '店铺名', '系统单号', '平台订单状态', '系统订单类型', '买家ID', '省', '市', '区',
                     '订单明细',
                     '快递名称', '快递单号', '是否组合商品', '是否拆分订单', '是否售后订单', '异常类型名称', '包裹重量',
                     '创建时间'])

                single_list['平台'] = jsonpath.jsonpath(i, '$..source_platform')
                single_list['店铺名'] = jsonpath.jsonpath(i, '$..shop_nick')
                single_list['系统单号'] = jsonpath.jsonpath(i, '$..trade_no')
                single_list['平台订单状态'] = jsonpath.jsonpath(i, '$..oln_status')
                single_list['系统订单类型'] = jsonpath.jsonpath(i, '$..trade_type')
                single_list['买家ID'] = jsonpath.jsonpath(i, '$..buyer')

            # ================================= 通过系统单号获取需要打印标签的组合商品名称 =================================#
            query_Trade_No = trade_no
            res = {'msg': '', 'id': ''}
            # 定义组合名称列表
            package_name = []
            a = 0
            for i in data_list:

                if query_Trade_No in i.get('系统单号')[0]:
                    a += 1  # 判断系统单号是否存在
                    orders = i.get('订单明细')[0]
                    # print(orders)
                    for order in orders:
                        item_name = order.get('item_name')  # 商品名称
                        sku_code = order.get('sku_code')  # 规格编码
                        size = order.get('size')  # 商品数量
                        price = order.get('price')  # 单价(商品标价)
                        is_package = order.get('is_package')  # 是否组合商品
                        receivable = order.get('receivable')  # 应收(原价)
                        order_total_discount = order.get('order_total_discount')  # 商品总优惠=原价-销售金额
                        payment = order.get('payment')  # 应收款
                        tp_tid = order.get('tp_tid')  # 线上单号
                        oln_item_id = order.get('oln_item_id')  # 线上商品id
                        if not sku_code:
                            sku_code = '0'
                        if not oln_sku_id:
                            oln_sku_id = '0'
                        if 'A0' in sku_code or 'A0' in oln_sku_id:
                            if oln_sku_name:
                                res0 = oln_sku_name.strip('颜色分类:')
                                res1 = res0.strip('尺寸:')
                                res2 = res1.strip('5套起拍;')
                                res3 = res2.strip(';')
                                res4 = res3.strip('规格:')
                                package_name.append(res4)
                            elif item_name:
                                res0 = item_name.strip('颜色分类:')
                                res1 = res0.strip('尺寸:')
                                res2 = res1.strip('5套起拍;')
                                res3 = res2.strip(';')
                                res4 = res3.strip('规格:')
                                package_name.append(res4)
                            else:
                                res['msg'] = '该买家没有组合商品!'
                                break

            if not package_name:
                if a > 0:
                    res['msg'] = '该买家没有组合商品!'
                else:
                    res['msg'] = '系统单号不正确!'
                # print('通过系统单号查找的组合名称:', package_name)
            else:
                res['msg'] = '打印完成!'

            for m in package_name:
                # 读取excel文件,获取workbook对象
                wb = openpyxl.load_workbook('E:/吊牌打印.xlsm', keep_vba=True)
                # 通过名称获取工作薄
                sheet = wb.active
                # 插入一行数据
                # sheet.append(["Hello", "World"])
                # 具体修改哪一行那一列的数据
                # 注意:cell的参数row、column必须是大于等于1的。
                # sheet.cell(1, 5).value = '菁娇微景观'
                sheet['B3'] = m
                sheet['B2'] = len(package_name)
                wb.save('E:/吊牌打印.xlsm')
                wb.close()
                xl = win32com.client.Dispatch("Excel.Application")
                xl.Workbooks.Open(Filename=r"E:\吊牌打印.xlsm")
                xl.Application.DisplayAlerts = False
                for count in range(int(print_num)):
                    xl.Application.Run("打印标签")
                # xl.Application.Save()
                # xl.Application.DisplayAlerts = True
                xl.Application.Quit()
                time.sleep(0.3)
    except:
        pass
    return res


if __name__ == '__main__':
    while True:
        trade_no_iput = input('请输入系统单号:')
        print_label(trade_no=trade_no_iput, print_num=2)


出错的问题:运行这个py文件,他while True 不是一直在运行着呢?一开始执行代码可以的,然后过上十来分钟,同样的可以出现结果(结果和最后一次的结果一样),但是实际上没有执行代码,快速的就return了,正常执行代码要十来秒的,他这么快速的返回结果肯定是不正常的,而且后台看打印结果,确实没有执行呢

  • 写回答

7条回答 默认 最新

  • IT里的交易员 2023-02-27 16:07
    关注

    1、检查get_all_labels 函数
    2、你使用了下面的语句,如果if条件状态不是200,语句没有任何处理,所以只要不是200就没下文了。print_label没有返回值,while无法开启下次循环。

        try:
            res = requests.post(url + url_path, data=data)
            # print(res.json())
            if res.status_code == 200:
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 3月12日
  • 已采纳回答 3月4日
  • 修改了问题 2月26日
  • 创建了问题 2月26日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效