Перейти к содержимому
  • 0
Koteyk0o

Очистка экрана один раз за цикл, и переход между страницами информации

Вопрос

Наверное это глупая тема, но все же.
Допустим у меня есть несколько страниц в дисплее с информацией и графикой.
Как очистить один раз экран в цикле?
И когда осуществляется переход между страницами дисплея, надо его чистить.
Но при этом, на некоторых страницах есть информация, которая обновляется в реал тайме.
И как сделать переход между страницами, не останавливая выполнение программы? Ну то-есть не используя os.sleep, чтобы информация на экранах могла обновляться, но и при этом был переход между страницами.

local component = require("component")
local term = require("term")
local gpu = component.gpu 
local computer = require('computer')
local rs = component.redstone

local green = 0x04ff00 -- зеленый цвет
local red = 0xff0000 -- красный цвет
local gray = 0x262525 -- серый цвет
local white = 0xffffff -- белый цвет
local yellow = 0xfaff00 -- желтый
local purple = 0xc300ff -- фиолетовый
local black = 0x000000 -- черный
local blue = 0x000cff -- синий

gpu.setBackground(black)

local function getAllSpecificComponets(filter)
local tableObjects ={}
for address, componentType in component.list(filter) do 
table.insert(tableObjects, component.proxy(address))
end
return tableObjects
end

local function mfsu() -- первая страница информации
gpu.setResolution(4,3)
gpu.setForeground(white)
gpu.set(1,1,'MFSU')
myMFSU = getAllSpecificComponets('mfsu')
gpu.set(1,3,tostring(math.floor(myMFSU[6].getStored()*100/40000000))..' %')
end

local function clocks() -- вторая страница информации
gpu.setResolution(5,3)
gpu.setForeground(white)
gpu.set(2,1,'TIME')
myMFSU = getAllSpecificComponets('mfsu')
gpu.set(1,3,os.date('%H:%M'))
end

while true do
mfsu()
-- Как вот тут сделать переход между страницами, не прерывая обновление информации?
clocks()
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

Тебе нужно постоянно перерисовывать страницы?

А переключаются они автоматом?

 

Заведи переменную какую-то. Таймер. И в неё записывай, как долго текущая страницы на экране висит.

Заведи ещё одну переменную - индикатор страницы. В неё пиши, какая сейчас страница на экране.

 

Вот пример в псевдокоде:

local page = 1
local timer = 0

while true do
  -- рисуем текущую страницу
  if page == 1 then
    mfsu()
  else
    clocks()
  end
  -- немного спим
  os.sleep(0.5)
  -- добавляем эти полсекунды к таймеру
  timer = timer + 0.5
  -- смотрим, не пора ли переключать
  if timer > 20 then
    page = (page + 1) % 2
    timer = 0
  end
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Спасибо, а как очистить экран один раз после переключения страницы?

То-есть убрать старую инфу с экрана

А то бывает что символы после переключения накладываются 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для очистки можно использовать либо term.clear() (библиотека Term API), либо gpu.fill(1, 1, ширина, высота, ' ') (компонент GPU).

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это я знаю, да

Но так как страница находится в цикле, если поместить в код страницы term.clear() допустим, то страница будет постоянно очищаться, то-есть мигать

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это я знаю, да

Но так как страница находится в цикле, если поместить в код страницы term.clear() допустим, то страница будет постоянно очищаться, то-есть мигать

 

Очищай её в момент переключения страниц. В моём примере это блок if timer > 20 then ... .

Изменено пользователем Totoro

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну а как допустим сделать действие один раз в цикле?

Изменено пользователем Koteyk0o

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

То-есть допустим есть цикл, есть функция

В функции есть команда print('Привет')

Функция находится в цикле, ибо там обновляется информация

Но в функции команда print('Привет') выполняется только один раз, хоть и функция в цикле

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почему же? Сколько раз выполнится функция в цикле, столько же раз выполнится и print

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Почему же? Сколько раз выполнится функция в цикле, столько же раз выполнится и print

я неправильно написал, как раз таки да, сколько выполнится функция, столько выполнится и print

а мне надо чтобы Print выполнился только один раз, хоть и функция в цикле

По идее надо сделать переменную, и если print выполняется один раз, то записываем это в переменную, и print больше не выполняется

Или можно сделать как-то еще?

Изменено пользователем Koteyk0o

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так я все таки не понял. Функция должна выполняться один раз или в цикле? Если один раз, то зачем ее в цикл ставить?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так я все таки не понял. Функция должна выполняться один раз или в цикле? Если один раз, то зачем ее в цикл ставить?

Вся функция должна выполняться в цикле, но в функции есть команда, которая выполняется один раз, помимо другого

То-есть вот так примерно

local function kek()
print('Привет') -- print надо выполнить один раз
if rs.getBundledInput(1,1) > 0 then
rs.setBundledOutput(1,5,255)
else
rs.setBundledOutput(1,5,0)
end
end

while true do
kek()
os.sleep(0.5)
end

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Можно разделить функцию на две:

local function kek1()
  print('Привет') -- print надо выполнить один раз
end

local function kek2()
  if rs.getBundledInput(1,1) > 0 then
    rs.setBundledOutput(1,5,255)
  else
    rs.setBundledOutput(1,5,0)
  end
end
 
kek1()
while true do
  kek2()
  os.sleep(0.5)
end

А можно воспользоваться флагом

local flag=true

local function kek()
  if flag then
    print('Привет') -- print надо выполнить один раз
    flag=false
  end
  if rs.getBundledInput(1,1) > 0 then
    rs.setBundledOutput(1,5,255)
  else
    rs.setBundledOutput(1,5,0)
  end
end
 
while true do
  kek()
  os.sleep(0.5)
end
Изменено пользователем Zer0Galaxy

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Вся функция должна выполняться в цикле, но в функции есть команда, которая выполняется один раз, помимо другого

 

 А зачем огород городить? Можно же просто перед циклом воткнуть print('Привет').

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

 

Можно разделить функцию на две:

local function kek1()
  print('Привет') -- print надо выполнить один раз
end

local function kek2()
  if rs.getBundledInput(1,1) > 0 then
    rs.setBundledOutput(1,5,255)
  else
    rs.setBundledOutput(1,5,0)
  end
end
 
kek1()
while true do
  kek2()
  os.sleep(0.5)
end

А можно воспользоваться флагом

local flag=true

local function kek()
  if flag then
    print('Привет') -- print надо выполнить один раз
    flag=false
  end
  if rs.getBundledInput(1,1) > 0 then
    rs.setBundledOutput(1,5,255)
  else
    rs.setBundledOutput(1,5,0)
  end
end
 
while true do
  kek()
  os.sleep(0.5)
end

Спасибо, как раз версия с флагом подходит

 

 А зачем огород городить? Можно же просто перед циклом воткнуть print('Привет').

Да, но тогда print будет выводиться только после запуска проги, а не после запуска функции

Тот код я всего лишь написал для примера

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...