用的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()
运行的结果:
情况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了,正常执行代码要十来秒的,他这么快速的返回结果肯定是不正常的,而且后台看打印结果,确实没有执行呢
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:
参考GPT和自己的思路,这个问题可能是由于tkinter的运行机制引起的,如果主线程被长时间的计算/循环占用,将无法处理其他事件,包括在用户按下按键时执行单击按钮操作的事件。
为了解决这个问题,可以将长时间运行的代码放到后台线程中,以使主线程可以继续响应事件。您已经在代码中实现了一个名为 thread_it 的函数,该函数接受一个函数作为参数,使用 threading.Thread 在后台执行该函数。
所以可以使用该函数来执行 get_all_labels 函数,如下所示:
def click_button(print_num):
global text
thread_it(get_all_labels, print_num)
text.insert(tk.END, f'本次打印了{trade_no_num}笔订单标签 \t{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')
这样就将 get_all_labels 函数移动到后台线程中,以避免在主线程中执行过长时间。另外,为了确保在后台线程中执行的代码正确更新 GUI,必须使用线程安全的 GUI 操作。
在 tkinter 中,可以使用 tkinter.StringVar 或 tkinter.IntVar 等变量类型来存储 GUI 组件的值,并使用 set() 方法在后台线程中更新它们的值。
例如,您可以为文本框 text 创建一个 tkinter.StringVar 对象,并在 click_button 函数中使用 text.set() 方法来设置文本框的值。
def click_button(print_num):
global text
thread_it(get_all_labels, print_num)
text.set(f'本次打印了{trade_no_num}笔订单标签 \t{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}\n')
这将确保在后台线程中更新文本框的值,并避免在主线程中执行任何长时间运行的代码。
```python
try:
#code
except:
#应该走这里了,把异常信息打印看下
```
线程被杀了?实际上推出了?debug打桩看看吧。是不是都没到哪里
该回答内容部分引用GPT,GPT_Pro更好的解决问题
python运行时间久了,def中的部分代码不会执行,但是可以显示出结果,一般可能是因为代码中出现了一些错误,或者是def中有一些无法执行的操作。
要解决这个问题,首先要明确这段代码的作用,是什么操作?再看看这段代码有没有什么错误?或者是不能执行的操作?
首先来看看这段代码的作用:
从import get_all_labels导入函数,在函数click_button()中调用get_all_labels()函数,传入print_num参数,然后在text中插入trade_no_num的值;在函数thread_it()中创建线程t,并将click_button()函数和参数2传入t中执行;在Print_all_Button中调用thread_it()函数。
接下来来看看这段代码有没有什么错误:
第2行和第3行之间没有任何内容;在第6行的变量trade_no_num的赋值语句中少了个“=”号;在第9行的thread_it()函数的定义中少了个","号。
还有不能执行的操作:
在Print_all_Button中调用thread_it()函数时,传入的参数是click_button()和2,但是click_button()函数需要传入print_num参数才能正常执行。
修改后的代码如下:
from 查询全部待打印标签 import get_all 1abels
def click_button(print_num):
global text
trade_no_num = get_all_labels(print_num=print_num)
text.insert(tk.END,trade_no_num)
def thread it(func,*args):
t = threading.Thread(target=func,args=args)
t.daemon = True
t.start()
Print_al1_Button = tk.Button(root,text="",bg="",width=286,height-5,command=lambda: thread_it(click_button,2,print_num))
Print_all_Button.pack()
text = tk.TextCroot
如果回答有帮助,望采纳。
该回答引用GPTᴼᴾᴱᴺᴬᴵ
看起来是一个Python程序,定义了一个函数print_label(trade_no, print_num),它接受两个参数:trade_no(一个字符串)和print_num(一个整数)。程序导入了几个模块,包括hashlib、urllib、time、datetime、jsonpath、openpyxl、requests和win32com.client。
-
在函数内部,定义了几个变量:url_path、query_time、data和_sign。然后,函数使用提供的数据发送一个POST请求到指定的URL,使用requests模块,其中包括_app、_t、pay_time、end_time、limit、page、trade_status和is_split参数。_sign参数使用hash_md5函数计算,并在发送请求之前包含在数据字典中。
-
如果响应状态码为200,则函数使用jsonpath模块从JSON响应中提取数据并将其分配给data_list。然后,函数遍历data_list中的每个元素,并检查trade_no参数是否是系统订单号(i.get('系统单号')[0])的子字符串。如果是,则将res4子字符串附加到package_name列表中。如果package_name列表中没有元素,则函数将res['msg']变量设置为'该买家没有组合商品!'。如果package_name列表中有元素,则函数将res['msg']变量设置为'打印完成!'。
-
最后,函数使用openpyxl模块加载Excel工作簿,并遍历工作簿中的每个工作表。如果工作表名称与package_name列表中的字符串匹配,则函数打印标签。如果工作表名称与package_name列表中的任何字符串都不匹配,则函数将res['id']变量设置为'组合名称不正确!'。
我先说说我的理解:第二张图片里面用了爬虫(您隐藏了一部分),第一张图片里面也会用图2里面的爬虫。虽然您检查了status_code,但时间一长,通常都是爬虫失效了,建议您在每次爬虫后查看详细返回结果。