如何修复 M1 Mac 外接显示器屏幕闪烁、白噪声、黑屏等问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何修复 M1 Mac 外接显示器屏幕闪烁、白噪声、黑屏等问题?相关的知识,希望对你有一定的参考价值。

参考技术A 如何修复 M1 Mac 的外部显示问题?M1 Mac 的外部显示问题有一些修复和解决方法,如果您遇到这些问题,可以尝试以下方法。

断开并重新连接显示器电缆

如果外屏闪烁或显示白噪声,您可以尝试在 Mac 开机的情况下断开并重新连接电缆。

这将导致 M1 Mac 刷新自己的显示器以及外部显示器,这通常会立即解决问题。

变化:从加密狗(不是从 Mac USB-C 端口)断开/重新连接显示电缆

对于我自己的 M1 MacBook Pro,简单地从 Mac 断开并重新连接 USB-C 适配器适配器并不能解决显示屏闪烁或白噪声问题。相反,我发现从 USB-C 加密狗适配器本身断开并重新连接 HDMI 电缆是可行的。

重新启动 Mac

重新启动 Mac 似乎也经常解决显示闪烁问题,但这很烦人,对于大多数 Mac 用户来说应该没有必要。相反,请尝试断开和重新连接电缆的上述方法。

如果显示器根本无法唤醒,强制重启 M1 Mac似乎可以暂时解决问题(直到它再次进入睡眠状态)。

解决方法:禁用显示器休眠

防止显示器进入睡眠状态也可以防止显示器闪烁问题。您可以通过几种不同的方式执行此操作:

在 Mac 上完全禁用外部显示器休眠

1.从苹果菜单打开「系统偏好设置」。

2.选择“电池”(M1 MacBook Pro、M1 MacBook AIr)或“节能器”(M1 Mac Mini、iMac)。

3.M1 Mac 笔记本电脑选择“电源适配器”,然后将“在…之后关闭显示器”的滑块拖动到“从不”。

使用热角暂时防止显示器休眠

设置一个 Hot Corner并选择“Prevent Sleep”作为 Hot Corner 配置,然后记住将鼠标光标扔到那个角落,使用时将防止睡眠。

在可用时安装 MacOS 软件更新

尽管此问题在现代 macOS 版本(包括 macOS Big Sur 11.4、macOS Big Sur 11.5 和某些用户的 macOS Monterey)中仍然存在,但安装最新的可用 macOS 系统软件更新最终可能会解决该问题,特别是如果这是 Apple 的错误固定的。

您可以通过苹果菜单 > 系统偏好设置 > 软件更新来更新 macOS 系统软件。

macOS Big Sur 11.3 显然已修复了 M1 Mac Mini 之前的显示器无法从睡眠中唤醒的问题,但一些用户仍然会遇到更高版本的 macOS 或该问题的变体(屏幕闪烁、白噪声、显示器卡在黑色等上),以及其他 M1 Mac 型号。

尝试不同的电缆或连接方法

有时,特定显示器的一根电缆可能会出现问题,而另一根则不会。或者有时一种特定的连接方法可能有问题,而另一种则没有。

例如,一些用户可能对便宜的 USB-C 转 HDMI 适配器有问题,但发现另一个更高质量的 USB-C 转 HDMI 适配器可能工作正常,或者如果 HDMI 不工作,则 USB-C 转 DisplayPort 电缆可能工作.

通过从带有加密狗的 HDMI 切换到与我的外部显示器兼容的 Warky USB-C 到 DisplayPort 电缆,我能够完全修复 M1 MacBook Pro 上闪烁的外部显示器和嘈杂的外部显示器。轶事,但这是需要考虑的,特别是如果像拔下和重新插入电缆这样的临时修复变得烦人的话。

M1 Mac 外部显示器问题的其他解决方案

混合报告还提到以下内容可能会有所帮助:

使用不同的 USB-C 端口、电缆或适配器

使用不同的连接方法(即:显示器上的 DisplayPort 而不是 HDMI)

将外接显示器设置为Mac 上的主显示器

“我的 M1 Mac 与外接显示器配合良好,但刷新率太低”

一些 M1 Mac 用户还发现外部显示器使用的可用刷新率是 30hz,而不是更流畅的 60hz、120hz、144hz 或更高的选项。

某些 HDMI 电缆、适配器和加密狗可能是显示器未显示 60hz 或更高作为选项的原因。

如何修复pygame闪烁

所以我决定尝试在pygame中创建一个应用程序,因为它比tkinter更复杂(它也帮助我已经使用了一些)并且我遇到了一个问题,其中只有部分文本闪烁。 (不是屏幕上的所有文字都只是其中的一部分)

一些环境信息:我在Windows 10上运行python 3.7 on atom。我已经尝试隔离问题,但我无法找到问题的起源,我通过正常运行文件检查它是否是原子,但没有帮助。

import pygame
from winsound import Beep
from roundrects import aa_round_rect
from time import sleep, time
pygame.init()
pygame.font.init()
window_h = 725
window_w = 1300
bg_grey = (230, 230, 230)
button_grey = (190, 190, 190)
del_button_grey = (165, 165, 165)
white = (255, 255, 255)
black = (0, 0, 0)
normalfont = pygame.font.SysFont("Aileron", 30)
mediumfont = pygame.font.SysFont("Aileron", 60)
largefont = pygame.font.SysFont("Aileron", 70)
window = pygame.display.set_mode((window_w, window_h))
morse_keystrokes = []
class Button: # this class will be used to draw and interact with a Button.
    def __init__(self, x, y, w, h, color, border=0, round=False, text=None, Font=mediumfont, Font_Color=black):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.color = color
        self.border = border
        self.round = round
        self.text = text
        self.Font = Font
        self.Font_Color = Font_Color
        self.draw()
    def draw(self):
        if self.round == False:
            if self.border != 0:
                pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
                pygame.draw.rect(window, black, (self.x, self.y, self.w, self.h), self.border)
                pygame.display.update()
            else:
                pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
                pygame.display.update()
        elif self.round == True:
            if self.border != 0:
                aa_round_rect(window, (self.x, self.y, self.w, self.h), black, 30, self.border, self.color)
                pygame.display.update()
            else:
                aa_round_rect(window, (self.x, self.y, self.w, self.h), self.color, 30)
                pygame.display.update()
        if self.text != None:
            self.draw_text()

    def clicked(self):
        mouse = pygame.mouse.get_pos()
        if self.x + self.w > mouse[0] > self.x and self.y + self.h > mouse[1] > self.y:
            return True
        else:
            return False

    def draw_text(self):
        Label(self.text, self.x, self.y, self.w, self.h, self.Font, self.Font_Color)


class Typing_Box:
    def __init__(self, x, y, w, h, color, dbc, border=0, font=normalfont, typing_font=mediumfont, font_color=black):
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.color = color
        self.dbc = dbc #delete button color
        self.border = border
        self.font = font
        self.typing_font = typing_font
        self.font_color = font_color
        self.draw()

    def draw(self):
        if self.border != 0:
            pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
            pygame.draw.rect(window, black, (self.x, self.y, self.w, self.h), self.border)
            pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
            pygame.draw.rect(window, black, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h), self.border)
        else:
            pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
            pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
        Label("DEL", self.x, self.y, self.w, self.h, self.font, self.font_color, (((window_w-self.x)-(self.w/15)+((self.w/15)/2)), (self.y+(self.h/2))))
        Label("".join(morse_keystrokes), self.x, self.y, self.w, self.h, self.font, self.font_color, ((self.x+((self.w/2)-(self.w/15)+35)), (self.y+(self.h/2)-10)))

    def update(self):
        if self.border != 0:
            pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
            pygame.draw.rect(window, black, (self.x, self.y, self.w, self.h), self.border)
            pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
            pygame.draw.rect(window, black, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h), self.border)
        else:
            pygame.draw.rect(window, self.color, (self.x, self.y, self.w, self.h))
            pygame.draw.rect(window, self.dbc, ((window_w-self.x)-(self.w/15), self.y, self.w/15, self.h))
        Label("DEL", self.x, self.y, self.w, self.h, self.font, self.font_color, (((window_w-self.x)-(self.w/15)+((self.w/15)/2)), (self.y+(self.h/2))))
        Label("".join(morse_keystrokes), self.x, self.y, self.w, self.h, self.typing_font, self.font_color, ((self.x+((self.w/2)-(self.w/15)+35)), (self.y+(self.h/2)-10)))

    def clicked(self):
        mouse = pygame.mouse.get_pos()
        if ((window_w-self.x)-(self.w/15)) + self.w > mouse[0] > ((window_w-self.x)-(self.w/15)) and self.y + self.h > mouse[1] > self.y:
            return True
        else:
            return False


class Label:
    def __init__(self, msg, x, y, w, h, font, font_color=black, alternate_center=None):
        self.msg = msg
        self.x = x
        self.y = y
        self.w = w
        self.h = h
        self.font = font
        self.font_color = font_color
        self.alternate_center = alternate_center
        self.draw()

    def render(self):
        textsurface = self.font.render(self.msg, True, self.font_color)
        return textsurface, textsurface.get_rect()

    def draw(self):
        textsurf, textrect = self.render()
        if self.alternate_center == None:
            textrect.center = ((self.x+(self.w/2)-3), (self.y+(self.h/2)))
        else:
            textrect.center = self.alternate_center
        window.blit(textsurf, textrect)
        pygame.display.update()


def Play_Beep(Type, box):
    if Type == 1:
        morse_keystrokes.append(".")
        box.update()
        Beep(800, 300)
    elif Type == 2:
        morse_keystrokes.append("_")
        box.update()
        Beep(800, 600)

def first_screen():
    window.fill(bg_grey)
    dit = Button(20, 40, 450, 250, button_grey, 2, True, "Dit")
    da = Button(20, 370, 450, 250, button_grey, 2, True, "Da")
    first_box = Typing_Box(150, 667, 1000, 55, button_grey, del_button_grey, 2)
    back = Button(-2, 677, 80, 50, button_grey, 2, False, "Back", normalfont)
    run = True
    while run:
        first_box.update()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                quit()
            if event.type == pygame.MOUSEBUTTONDOWN:
                if dit.clicked():
                    Play_Beep(1, first_box)
                elif da.clicked():
                    Play_Beep(2, first_box)
                elif first_box.clicked():
                    start = time()
                    global morse_keystrokes
                    morse_keystrokes = morse_keystrokes[:-1]

first_screen()

TIA,非常感谢任何帮助

答案

这些文章会有所帮助。

Flickering dice image when i press my dice button.

Python Tkinter refresh canvas

以下是tkinter问题的答案,但它类似于pygame问题的答案。我会引用这个,因为它似乎更简洁。

画布刷新的唯一方法是为事件循环提供服务“重绘”事件。在你的循环中,你永远不会给事件循环提供更新的机会,所以你没有看到任何变化。

快速解决方法是调用self.canvas.update_idletasks,但这只是一个黑客而不是一个合适的解决方案。

做动画的正确方法是使用事件循环来进行迭代。您可以通过将要完成的工作放在队列上来完成此操作 - 在本例中为空闲事件队列。您可以使用after命令将事物放在此队列中。

你应该做的是编写一个函数,对你的动画进行一次迭代。基本上,将while循环中的所有内容都移到函数中。然后,只要有工作要做,就安排不断调用该功能。您可以在该函数中调用after,也可以使用单独的函数控制动画。

另一答案

谢谢你的帮助但事实证明我正在更新屏幕框架。

以上是关于如何修复 M1 Mac 外接显示器屏幕闪烁、白噪声、黑屏等问题?的主要内容,如果未能解决你的问题,请参考以下文章

苹果mac外接显示器怎么设置

Mac外接显示器无信号

Mac系统外接屏幕后鼠标只能往右侧移动才能移到另一个桌面,如何设置成四个角都能移动到另一个桌面。

mac在连接外接显示器时,关闭内置显示器

Mac 外接 2K 显示屏教程

射频IC设计的六边形法则