长视频为什么在广告市场上节节败退?

作者:刀客doc

在广告市场,长视频网站的吸引力在减小,这是不争的事实。不过最近我发现,这一趋势还在加剧。

近期,一份QuestMobile的数据预测了互联网各类媒介的市场份额。其中5年来,在线视频广告的份额年年下降,明年预估占比达2.9%,不到3个点了。

这一点也能从财报上反映出来:今年二季度,爱奇艺在线广告收入为15亿元,同比下滑2%。芒果TV亦是此种状况。2024上半年,芒果超媒广告营收17.21亿元,同比下滑3.9%。只有腾讯视频广告业务在增长,二季度广告收入同比增速为30%。但是这也难以扭转长视频在广告市场节节败退的颓势。

一、

广告业务的败退除了会员业务的制约,还有个原因是很多广告主在考量长视频广告的效果时,指标发生了变化。

近年来,比起CPM为代表的曝光指标,品牌广告主越来越重视CTR(点击率)。因为CTR是衡量广告吸引力的一个重要指标,直接反映用户兴趣。高CTR通常意味着广告内容更能引起目标用户的兴趣和关注。

同时,CTR还有一个作用就是预测用户的转化潜力。因为用户既然到了点击的阶段,下一步就会开始对品牌种草-消费了,CTR越高带来的销售转化率就越高。

但是,广告主会与把长视频平台甚至短视频平台的CTR进行成本对比,作为后续预算分配的重要参考。

由于长视频广告都只能触达非会员用户,miss了潜在消费能力强的用户群体。即使有少数触达会员的广告,为考虑会员用户的体验,视频网站普遍相对“收敛”,这使得广告主的CTR大打折扣。

此外还有一点,视频平台的流量分布极为不平衡,也让广告主非常头疼:头部IP的优质资源普遍缺量,但是中腰部的普通资源广告主却不买单。

从采买方式上看,头部内容一般是CPM-合约广告的方式,这是广告主最主流和首选的采购方式,常规分级按刊例*折扣,存在议价空间,但是头部综艺/剧,视频平台一般是待价而沽,通常By case核价。

如果列一个list会发现,长视频的KA大客户也就100多个,这些客户支撑着全网一半以上的品牌广告费(区别于效果广告费用)。这些品牌所在的行业集中度很高,主要就是大快消行业,比如食品饮料、日化美妆、3C等。

由于行业属性相同,因而这些品牌在投放定向需求上重叠度也很高,这就造成了优质资源总缺量,品牌只能靠抢。为了维护客情关系,如果真的发生缺量的情况,长视频平台往往会给签了年框的品牌进行10%~20%左右的曝光赠送。

于是你会发现,这两年头部剧集的广告越来越多,动不动就是三四十个品牌,《庆余年2》甚至出现了蒙牛伊利在同一剧中赞助的「奇观」,这种情况以前是极少发生的。

另外一方面,当头部资源抢破头,普通资源(低线城市/低级别内容)库存却大量剩余,无人问津。

因此,爱奇艺、优酷、芒果等平台普通资源(低级别内容)的广告资源位,均接入了ADX(Ad Exchange广告交易平台),一般是CPM/CPV/CPC竞价购买。CPV指的是按照有效观看,例如广告时长15秒,观看3秒以上才计算一次有效观看费用。

这一部分的广告单价较低,长视频网站就按照长尾流量售卖了。好在效果广告的转化效率在提升,再加上AIGC对效果广告素材的生产有了极大的推进作用,效果广告对长视频广告的贡献在提升。

对品牌广告主来说,好的广告位抢不到,差的广告库存又不愿意买,只好将一部分预算从长视频撤走。

二、

不同行业对长视频广告的投放有不同的需求,比如食品饮料在内容植入上选择面较广泛,在投放逻辑上,是人群>内容。而美妆类品牌偏好垂直类内容植入,重视内容IP的立意和质感

头部品牌在选择投放标的的时候,更在乎IP的内容差异、用户人群覆盖。这里面的人群不限于平台用户,也会更重视剧综IP的观众群体用户画像。

投长视频网站的品牌,核心诉求是实现大曝光,触达目标用户进行品宣种草。所以,头部品牌普遍会选择「内容植入+贴片」联投的模式。

比如蒙牛纯甄在《庆余年2》中做了深度的植入,除此之外,它还会匹配更多的贴片广告(比普通资源的CPM贵50%以上),以此形成整合投放的效果,这方面的收入贡献达70%~80%。

这也解释了一个现象,虽然IP内容的植入空间寥寥,对广告营收的拉动贡献有限,却依然非常重要:因为大IP对长视频平台的硬广消耗有极大的撬动效果。

我跟优酷的一个销售朋友聊,他说,也有不少头部客户会选择只投贴片广告这样的硬广。

典型的品牌如苹果、宜家。这主要是因为他们的品牌力极强,品牌安全比曝光更重要。对这些品牌来说,植入广告的风险不小,成本也很大。他们一般对植入的场景、明星以及情节要严格把控,且在投放上要求更安全的环境,不希望自己的品牌出现在擦边、极端新闻的旁边,以免拉低品牌调性。

另外还有一些区域型客户会只投放贴片广告。主要是他们的预算确实不高,属于腰尾部客户,在选人群标签时候,一般都是直接定向所在城市,这个时候内容植入对他们来说性价比就不高了。

三、

与视频网站的合作,品牌不会只在一两家投放,而是全都以签年框的形式,爱优腾芒四家主流视频平台雨露均沾,超头部的广告主在单一平台的年度预算一般是2000万起步。

但是这笔预算是根据消耗情况实时变化的,广告主会结合节点(营销节点或者产品上市节点)投放,实际消耗金额不一定就是年框约定的金额,受平台流量、广告库存影响较大,不是说签了2000万就一定在这家平台消耗完。

因此广告费处在不断动态调整的过程中,一些没有消耗完的长视频广告费流向了其他平台。大概两个流向:

1、转向抖音快手等短视频平台

以乳制品为例,伊利、蒙牛为代表的乳企一直是广告投放的最大金主。根据QuestMobile的监测数据,这一行业在长视频上的广告投入也在收缩:今年上半年,乳制品行业仅有17.1%的广告预算分配给了长视频平台,而去年这一比例为24.5%。

与此同时,乳制品企业更倾向于将广告预算投向短视频平台。2024年上半年,乳制品行业有37.2%的广告预算投向了短视频平台,而去年这一比例为19.8%。

这一趋势的背后,是短视频平台在转化效率和变现路径上的明显优势。我采访过欧莱雅的一个品牌经理,她的反馈是,短视频平台的Topview广告,在折算后的CTR成本优于贴片广告,因此将大量预算转移到了短视频平台上。

2、转向达人种草营销,提升用户心智

尽管能实现最大化的曝光,但是品牌已经不满足于A1\A2人群的获取,转向内容营销(种草/KOL),典型如头部美妆客户倾斜预算至小红书、抖音等种草平台。

种草营销的优势是它比传统品牌广告离交易更近,更能拉动销售,同时又比效果广告更能帮助品牌影响用户心智。

根据questmobile的数据,2024年1-7月,典型行业广告主在抖音和小红书上的软广投放费用分别达到71.72亿元、45.91亿元。抖音硬广和达人软广的比例是3:1,小红书的比例将近1:1。

而据益普索的调研数据,7成受访品牌表示未来的种草投入将占营销总投入的50%以上,几乎所有受访品牌未来1至2年将保持或增加种草营销的预算。

四、

目前长视频还没有找到更好的广告模式去增加营收,主要还是靠好的内容作为主要驱动力,来牵引会员和广告收入。但是头部的内容生产依然存在不确定性,市场上爆款剧集和综艺的数量有限。

长视频平台在增加库存上,已经做了很多尝试:

1、想方设法让会员看广告:比如可跳过的前贴、中插;与内容贴合度更紧密的广告等。这些都已经很常见了。

2、采用更炫酷、更有冲击力的创新样式:类似破屏、闪屏、霸屏、全屏暂停、视觉3D等更加吸引用户注意力的广告。

3、把一部分软广按照硬广化(按贴片)售卖:例如正片前口播广告的形式。主要是由于植入内容第三方检测难度大,很多品牌愿意付更高的费用植入监测代码,看植入的广告效果。

4、创新互动广告:比如弹幕广告、评论区广告、互动交互玩法等,互动广告可以有效提升用户的CTR。

在我看来,这些尝试要么很难标准化,只能做定制;要么费用很高,难以普及;要么用力过猛会影响用户体验,所以还不能大幅度提升广告营收。

电视大屏在未来倒可能是一个增长点。

目前海外的YouTube、亚马逊的prime都在CTV联网电视上发力。据 eMarketer 的预测,美国联网电视 (CTV) 广告年销售额超过 10 亿美元的公司数量从 2020 年的 2 家,在今年将增长到 5 家。

不过这一市场在国内比较独特,它是个三角结构:由平台方、牌照方和终端方组成,相对来说比较复杂,同时受到政策监管、效果监测的问题,国内CTV市场一直没有像海外一样爆发,短期内也还难以成为视频平台的第二增长点。

对长视频网站的广告变现来说,前有猛虎,后有追兵。今年以来,连Netflix这个国内长视频的标杆,都开始认真考虑做广告了,爱优腾芒们也是时候认真想一下,怎么能赚更多广告费了。

import PySimpleGUI as Py import time import os import hashlib import logging Py.theme('Default') # PySimpleGUI 设置主题颜色,接近护眼色的内置主题:'LightGreen''TanBlue''DefaultNoMoreNagging''GreenTan' # ======== 原始主程序内容从这里开始 ======== image_path2 = "D:/software/demo/pythonProject/images/image2.png" image_path3 = "D:/software/demo/pythonProject/images/image3.png" image_path4 = "D:/software/demo/pythonProject/images/image4.png" image_path5 = "D:/software/demo/pythonProject/images/image5.png" image_path6 = "D:/software/demo/pythonProject/images/image6.png" image_path7 = "D:/software/demo/pythonProject/images/image7.png" image_path8 = "D:/software/demo/pythonProject/images/image8.png" image_path9 = "D:/software/demo/pythonProject/images/image9.png" # 检查图片是否存在 if not os.path.exists(image_path2): print(f"[!] 图片2不存在: {image_path2}") image_path2 = None if not os.path.exists(image_path3): print(f"[!] 图片3不存在: {image_path3}") image_path3 = None if not os.path.exists(image_path4): print(f"[!] 图片4不存在: {image_path4}") image_path4 = None if not os.path.exists(image_path5): print(f"[!] 图片5不存在: {image_path5}") image_path5 = None if not os.path.exists(image_path6): print(f"[!] 图片6不存在: {image_path6}") image_path6 = None if not os.path.exists(image_path7): print(f"[!] 图片7不存在: {image_path7}") image_path7 = None if not os.path.exists(image_path8): print(f"[!] 图片8不存在: {image_path8}") image_path8 = None if not os.path.exists(image_path9): print(f"[!] 图片9不存在: {image_path9}") image_path9 = None a = ' 漫息!' # 其显示收到layout2 = [size=(170, 10)]中10行显示的限制 b = '【' layout1 = [[Py.Button(b,button_color=('#006400', 'white'), font=("华文楷体", 12))]] window1_position = (514, 24) # 定义主窗口的布局,这里设置了窗口在屏幕上的起始位置为(横坐标50, 纵坐标50) window1 = Py.Window('', layout1, size=(1532, 44), no_titlebar=True, location=window1_position, finalize=True) window1.keep_on_top_set() layout2 = [[Py.Image(key='img2', filename=image_path2) if image_path2 else Py.Text("加载失败")], [Py.Text(a, size=(23, 200), auto_size_text=True)]] window2_position = (2340, 145) # 屏幕尺寸2560*1440 window2 = Py.Window('', layout2, size=(220, 750), no_titlebar=True, location=window2_position, finalize=True) window2.keep_on_top_set() # 全局标志防止重复运行 reminder_running = False def run_periodic_reminder(): global reminder_running if reminder_running: print("[!] 提醒功能已在运行,忽略重复调用") return reminder_running = True layout9 = [[Py.Image(key='img9', filename=image_path9) if image_path9 else Py.Text("加载失败")], [Py.Text("天", font=("华文楷体", 10), text_color='blue')], [Py.Text("📌 周期性提醒已激活:每次取消后10秒自动重试")], [Py.Multiline("", size=(60, 4), key='-OUTPUT-', disabled=True, autoscroll=True)], [Py.Button('退出', key='EXIT', button_color=('#800000', 'Silver')), Py.Text("", font=("华文楷体", 10), text_color='red')]] window9_position = (1795, 300) window9 = Py.Window('', layout9, size=(460, 490), finalize=True, location=window9_position) window9.keep_on_top_set() next_popup_time = time.time() + 1 reminder_active = True popup_active = False input_popup = None def show_input_popup(): layout_popup = [[Py.Text(':')], [Py.Input(key='-INPUT-', size=(6, 1), font=("Arial", 20), focus=True), Py.Text('或', font=("华文楷体", 16), text_color='#000000'), Py.Text('动', font=("华文楷体", 22), text_color='red', background_color='#86A8FF')], [Py.Button('属于', button_color=('#800000', 'white'), bind_return_key=True), Py.Push(), Py.Button('不属于', button_color=('#000000', 'white'))]] windowpopup_position = (1890, 680) return Py.Window('', layout_popup, keep_on_top=True, modal=True, location=windowpopup_position, finalize=True, grab_anywhere=False) try: while True: # === 安全 read():用 try-except 捕获 TclError === try: event9, values9 = window9.read(timeout=100) except (RuntimeError, Exception) as e: # 常见于窗口关闭后底层 TK 资源已释放 if "wrapped C/C++ object has been deleted" in str(e) or "TclError" in str(e): print("[INFO] 窗口已被系统关闭,退出提醒循环。") break else: print(f"[ERROR] Unexpected error: {e}") break if event9 in (None, 'EXIT', Py.WINDOW_CLOSED): # 如果 read 返回 None,说明窗口被关闭 layout10 = [[Py.Image(key='img2', filename=image_path2) if image_path2 else Py.Text("加载失败")], [Py.Text(a, size=(23, 200), auto_size_text=True)]] window10_position = (2340, 145) # 屏幕尺寸2560*1440 window10 = Py.Window('', layout10, size=(220, 750), location=window10_position, finalize=True) window10.keep_on_top_set() break now = time.time() # 自动弹出输入框逻辑 if reminder_active and not popup_active and next_popup_time and now >= next_popup_time: popup_active = True try: input_popup = show_input_popup() except Exception as e: print(f"[Error] 无法创建弹窗: {e}") popup_active = False next_popup_time = now + 10 continue if input_popup: # 处理输入弹窗 try: event_p, values_p = input_popup.read(timeout=100) except (RuntimeError, Exception): input_popup = None popup_active = False continue if event_p == '属于': user_input = values_p['-INPUT-'].strip() try: num = float(user_input) formatted_num = int(num) if num.is_integer() else num window9['-OUTPUT-'].update(f"✔️ 录入成功:{formatted_num} —— 提醒停止\n", append=True) reminder_active = False next_popup_time = None except ValueError: window9['-OUTPUT-'].update(f"❌ 输入无效:'{user_input}',60秒后重试...\n", append=True) next_popup_time = time.time() + 60 finally: try: input_popup.close() except: pass input_popup = None popup_active = False elif event_p in (None, '不属于', Py.WINDOW_CLOSED): try: input_popup.close() except: pass input_popup = None popup_active = False window9['-OUTPUT-'].update("⛔ 用户取消,60秒后将再次提醒...\n", append=True) next_popup_time = time.time() + 60 finally: # 确保清理 if 'window9' in locals() or window9 is not None: try: window9.close() except: pass if input_popup is not None: try: input_popup.close() except: pass reminder_running = False def run_single_flow(): """运行一次完整的 window4 流程""" Py.theme('LightBlue') input_history = [] # 存储已确认的数字 last_input_time = None INPUT_TIMEOUT = 5.0 current_text = '' # 使用一个固定宽度的 Text 框实现横向排列 + 自动换行 layout4 = [[Py.Image(key='img4', filename=image_path4) if image_path4 else Py.Text("加载失败")], [Py.Text("请在5秒内输入当前动量,之后5秒无操作将自动记录:")], [Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), focus=True), Py.Text("", size=(60, 1), key='-STATUS-')], [Py.Text(":")], # 设置size=(None, 10)表示不限宽度列,高度最多10行;text_color和background_color提升可读性 [Py.Frame('', [[Py.Text("", size=(48, 15), key='-HISTORY-', relief='sunken', background_color='white', text_color='black', font=('Courier', 15))]], size=(590, 75), pad=10)], # 外层长590*75,最多10行,字体大小为15,内层长度48超出则自动换行,控制内层显示区域大小以便触发换行,内层过长超过外层将会看不到换行 [Py.Button('美边', button_color=('#006400', 'Silver'))], # 用一个大括号使他们在同一行显示 [Py.Button('同向', button_color=('#000000', 'white')), Py.Button('不符合', button_color=('#800000', 'Silver'))]] window4_position = (1795, 300) window4 = Py.Window('', layout4, size=(460, 500), resizable=True, location=window4_position, finalize=True) window4.keep_on_top_set() while True: event4, values4 = window4.read(timeout=100) if event4 == Py.WINDOW_CLOSED: break new_text = values4['-INPUT-'].strip() input_changed = new_text != current_text current_text = new_text valid_number = False # 验证是否为有效数字 try: if current_text: float(current_text) valid_number = True except ValueError: pass if input_changed and valid_number: # 输入变化且合法 → 重置计时器 last_input_time = time.time() window4['-STATUS-'].update(f"✅ 输入中 '{current_text}' ... 5秒无操作将自动提交") if last_input_time is not None: # 超时自动提交 elapsed = time.time() - last_input_time if elapsed >= INPUT_TIMEOUT: try: num = float(current_text) formatted_num = int(num) if num.is_integer() else num input_history.append(formatted_num) history_str = ' '.join(map(str, input_history)) # 更新历史显示:空格分隔,让系统自动换行 window4['-HISTORY-'].update(history_str) window4['-STATUS-'].update("🎉 已自动记录!") window4['-INPUT-'].update('') current_text = '' last_input_time = None except Exception as e: window4['-STATUS-'].update("❌ 提交失败") last_input_time = None elif last_input_time is None and current_text and not valid_number: # 状态栏提示 window4['-STATUS-'].update("❌ 请输入有效的数字") elif last_input_time and valid_number: remaining = max(0, int(INPUT_TIMEOUT - (time.time() - last_input_time) + 0.9)) if remaining > 0: window4['-STATUS-'].update(f"⏳ 还剩 {remaining} 秒自动提交...") if event4 in (Py.WIN_CLOSED, '不符合'): window4.close() elif event4 == '同向': window4.close() layout5 = [[Py.Image(key='img5', filename=image_path5) if image_path5 else Py.Text("加载失败")], [Py.Text("请在5秒内输入当前动量,之后5秒无操作将自动记录:")], [Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20)), Py.Text("", size=(60, 1), key='-STATUS-')], # 设置 size=(None, 10) 表示不限宽度列,高度最多10行;text_color 和 background_color 提升可读性 [Py.Frame('', [[Py.Text("", size=(49, 15), key='-HISTORY-', relief='sunken', background_color='white', text_color='black', font=('Courier', 15))]], size=(410, 50), pad=10)], # 控制整体显示区域大小以便触发换行 [Py.Button('进入弱', button_color=('#000000', 'Silver')), Py.Push(), Py.Button('进入强', button_color=('#000000', 'Silver'))]] window5_position = (1795, 300) window5 = Py.Window('', layout5, size=(460, 430), resizable=True, location=window5_position, finalize=True) window5.keep_on_top_set() while True: event5, values5 = window5.read(timeout=100) if event5 == Py.WINDOW_CLOSED: break new_text = values5['-INPUT-'].strip() input_changed = new_text != current_text current_text = new_text valid_number = False # 验证是否为有效数字 try: if current_text: float(current_text) valid_number = True except ValueError: pass if input_changed and valid_number: # 输入变化且合法 → 重置计时器 last_input_time = time.time() window5['-STATUS-'].update(f"✅ 输入中 '{current_text}' ... 5秒无操作将自动提交") if last_input_time is not None: # 超时自动提交 elapsed = time.time() - last_input_time if elapsed >= INPUT_TIMEOUT: try: num = float(current_text) formatted_num = int(num) if num.is_integer() else num input_history.append(formatted_num) history_str = ' '.join(map(str, input_history)) # 更新历史显示:空格分隔,让系统自动换行 window5['-HISTORY-'].update(history_str) window5['-STATUS-'].update("🎉 已自动记录!") window5['-INPUT-'].update('') current_text = '' last_input_time = None except Exception as e: window5['-STATUS-'].update("❌ 提交失败") last_input_time = None elif last_input_time is None and current_text and not valid_number: # 状态栏提示 window5['-STATUS-'].update("❌ 请输入有效的数字") elif last_input_time and valid_number: remaining = max(0, int(INPUT_TIMEOUT - (time.time() - last_input_time) + 0.9)) if remaining > 0: window5['-STATUS-'].update(f"⏳ 还剩 {remaining} 秒自动提交...") elif event5 == '进入弱': window5.close() Py.theme('LightBlue') recorded_numbers = [] # 历史记录列表 layout6 = [[Py.Image(key='img6', filename=image_path6) if image_path6 else Py.Text("加载失败")], [Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), do_not_clear=False)], # do_not_clear=False 表示默认清空 [Py.Button('【中进】', button_color=('#006400', 'Silver'), bind_return_key=True), Py.Button('不于进', button_color=('#800000', 'Silver'))], [Py.HorizontalSeparator()], [Py.Text("", size=(50, 2), key='-HISTORY-', relief='sunken', background_color='white', text_color='black')]] window6_position = (1795, 300) window6 = Py.Window('', layout6, size=(460, 395), location=window6_position, finalize=True) window6.keep_on_top_set() while True: event6, values6 = window6.read() if event6 == Py.WINDOW_CLOSED: break input_value = values6['-INPUT-'].strip() if event6 == '【中进】': window2.close() if input_value == '': window6['-HISTORY-'].update("⚠️ 输入为空,无法保留") else: try: num = float(input_value) formatted_num = int(num) if num.is_integer() else num recorded_numbers.append(formatted_num) history_text = ' '.join(map(str, recorded_numbers)) window6['-HISTORY-'].update(history_text) window6['-INPUT-'].update('') # ✅ 在 close 前更新 except ValueError: # 注意:这里 '-STATUS-' 并未定义,建议检查 layout 是否包含该 key pass # 避免异常中断 window6.close() # ✅ 关闭放最后 run_periodic_reminder() elif event6 == '不于进': window6['-INPUT-'].update('') # 直接清空输入框 elif event5 == '进入强': window5.close() Py.theme('LightBlue') recorded_numbers = [] # 历史记录列表 layout7 = [[Py.Image(key='img7', filename=image_path7) if image_path7 else Py.Text("加载失败")], [Py.Text("请:")], [Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), do_not_clear=False)], # do_not_clear=False表示默认清空 [Py.Button('出现【再', button_color=('#006400', 'Silver'), bind_return_key=True), Py.Button('不于进', button_color=('#800000', 'Silver'))], [Py.HorizontalSeparator()], [Py.Text("", size=(53, 2), key='-HISTORY-', relief='sunken', background_color='white', text_color='black')]] window7_position = (1795, 350) window7 = Py.Window('', layout7, size=(460, 450), location=window7_position, finalize=True) window7.keep_on_top_set() while True: event7, values7 = window7.read() if event7 == Py.WINDOW_CLOSED: break input_value = values7['-INPUT-'].strip() if event7 == '出现【再': window2.close() if input_value == '': window7['-HISTORY-'].update("⚠️ 输入为空,无法保留") else: try: num = float(input_value) formatted_num = int(num) if num.is_integer() else num recorded_numbers.append(formatted_num) history_text = ' '.join(map(str, recorded_numbers)) window7['-HISTORY-'].update(history_text) window7['-INPUT-'].update('') # ✅ 先更新 except ValueError: pass window7.close() # ✅ 再关闭 run_periodic_reminder() elif event7 == '不于进': # 直接清空输入框 window7['-INPUT-'].update('') elif event4 == '美边': window2.close() window4.close() run_periodic_reminder() # 弹出礼物窗口 while True: # 主事件循环 event1, values1 = window1.read() if event1 == Py.WIN_CLOSED: break if event1 == b: layout3 = [[Py.Image(key='img3', filename=image_path3) if image_path3 else Py.Text("加载失败")], [Py.Button('第1', button_color=('#006400', 'white')),Py.Push(), Py.Button('第3', button_color=('#006400', 'white'))]] # 用一个大括号使他们在同一行显示 window3_position = (1795, 400) window3 = Py.Window('交易类型', layout3, size=(460, 190), location=window3_position, finalize=True, keep_on_top=True) window3.keep_on_top_set() while True: event3, values3 = window3.read() if event3 == Py.WINDOW_CLOSED: break if event3 == '第1': window3.close() run_single_flow() if event3 == '第3': window3.close() layout8 = [[Py.Image(key='img8', filename=image_path8) if image_path8 else Py.Text("加载失败")], [Py.Text("决战", font=("华文楷体", 13), text_color='blue')], [Py.Input(key='-INPUT-', size=(10, 1), font=("Arial", 20), focus=True), Py.Text("", size=(60, 1), key='-STATUS-')], # 设置size=(None, 10)表示不限宽度列,高度最多10行;text_color和background_color提升可读性 [Py.Frame('', [ [Py.Text("", size=(48, 15), key='-HISTORY-', relief='sunken', background_color='white', text_color='black', font=('Courier', 15))]], size=(590, 75), pad=10)], # 外层长590*75,最多10行,字体大小为15,内层长度48超出则自动换行,控制内层显示区域大小以便触发换行,内层过长超过外层将会看不到换行 [Py.Button('败退', button_color=('#006400', 'Silver')), Py.Button('反击', button_color=('#006400', 'Silver')), # 用一个大括号使他们在同一行显示 Py.Button('不符合', button_color=('#800000', 'Silver'))]] window8_position = (1795, 300) window8 = Py.Window('', layout8, size=(460, 470), resizable=True, location=window8_position, finalize=True) window8.keep_on_top_set() while True: event8, values8 = window8.read(timeout=100) if event8 == Py.WINDOW_CLOSED: break if event8 in (Py.WIN_CLOSED, '不符合'): window8.close() if event8 == '败退' or event8 == '反击': window8.close() window2.close() run_periodic_reminder() if event8 == '不符合': window8.close() 在窗口9的点击退出按钮后会出现窗口10,然后在窗口4的美边按钮,窗口6的中进按钮,窗口7的出现【再按钮,窗口8的败退和反击按钮,在点击上述按钮时候窗口10关闭
11-14
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值