Как в GUI показывать текст из файла, который меняется? - PullRequest
0 голосов
/ 23 января 2019

В файле 1.txt в первой строке есть надпись, которая со временем меняется.В графическом интерфейсе это также должно быть изменено.Как сделать так, чтобы оно не мерцало?

Local $Form1 = GUICreate('Form1', 261, 200, 192, 124)
$10 = FileReadLine ( "1.txt",  1);
GUISetState()
Local $spic = $10, $Pic1
While 1
    $Pic1 = GUICtrlCreateLabel($10, 10, 70, 235, 50)
    Switch FileExists($spic)
        Case 0
            If $Pic1 Then
                GUICtrlDelete($Pic1)
                $Pic1 = 0
            EndIf
        Case 1
            If Not $Pic1 Then $Pic1 = GUICtrlCreatePic($spic, 16, 24, 212, 124)
    EndSwitch
    Sleep(1)
WEnd

1 Ответ

0 голосов
/ 24 января 2019
#include <GUIConstantsEx.au3>

; Create the Gui.
$Form1 = GUICreate('Form1', 261, 200, 192, 124)
$iLabel = GUICtrlCreateLabel('', 10, 10, 235, 50)
$iPic = GUICtrlCreatePic('', 16, 34, 212, 124)
GUISetState()

; Hide picture control if no file [True|False].
$bHideImage = FileExists('default.jpg') ? False : True

; Updates in the loop to recognize change.
$sSavedFilename = ''

; Set time to reset image etc.
$iTimeReset = 1000
$hTimeStamp = TimerInit()

While 1
    ; Get Gui messages.
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            Exit
    EndSwitch

    ; Check if time needs reset.
    If TimerDiff($hTimeStamp) > $iTimeReset Then
        $hTimeStamp = TimerInit()
    Else
        ContinueLoop
    EndIf

    ; Read 1st line of a file.
    $sReadFilename = FileReadLine ('1.txt', 1)

    ; If the saved line is different to read line.
    If $sSavedFilename <> $sReadFilename Then
        GUICtrlSetData($iLabel, $sReadFilename)

        Switch FileExists($sReadFilename)
            Case 0
                If $bHideImage Then
                    GUICtrlSetState($iPic, $GUI_HIDE)
                Else
                    ; Display a default (blank?) image.
                    GUICtrlSetImage($iPic, 'default.jpg')
                EndIf

            Case 1
                If $bHideImage Then
                    GUICtrlSetState($iPic, $GUI_SHOW)
                EndIf

                ; Display the new image.
                GUICtrlSetImage($iPic, $sReadFilename)
        EndSwitch

        ; Save the current filename.
        $sSavedFilename = $sReadFilename
    EndIf
WEnd

Сон с точностью примерно до 10 миллисекунд, что очень мало времени для обновления элемента управления, поэтому вы получаете мерцание.

Обновление меток, которые не происходятна событие, такое как нажатие кнопки, может быть обработано с помощью таймера.

Если вы используете цикл сообщений Gui, то вы получаете сообщения Gui с помощью GuiGetMsg .После сообщений вы можете проверить отметку времени, чтобы узнать, больше ли разница во времени, чем значение сброса времени, которое в настоящее время установлено как 1000 миллисекунд.Если оно больше, таймер сбрасывается и выполняется приведенный ниже код, иначе цикл будет продолжен сверху.

Имя файла, прочитанное из текстового файла, сохраняется в $sSavedFilename.Обновление элементов управления выполняется только в том случае, если имя файла для чтения отличается.Если имя файла для чтения не существует, отобразите изображение по умолчанию (пустое?).Иногда я выбираю изображение по умолчанию, в противном случае пустое имя файла может вызвать проблемы с размером элемента управления при следующем изменении изображения.Элемент управления может быть скрыт, если нет изображения для показа.$bHideImage current решает использовать файл default.jpg, если существует, иначе скрывает элемент управления.

Этот код обновляет созданные элементы управления вместо их удаления и повторного создания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...