Создать калькулятор с графическим интерфейсом пользователя в Powershell

Вопрос или проблема

Привет, ребята.
Я пытаюсь создать калькулятор. На данный момент у меня готов графический интерфейс. Но мне нужна помощь с фоновыми функциями. Пример: я нажимаю на кнопки 5+6. Теперь, когда я нажимаю “=”, ввод из текстового поля должен быть помещен в переменную и затем вычислен. У кого-нибудь есть идея, как это сделать. (Я совсем новичок в Powershell).
Спасибо и извините за мой плохой английский.
Привет,
Сандро

   [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

#Платформа
$Taschenrechner = New-Object System.Windows.Forms.Form
$Taschenrechner.StartPosition = "CenterScreen"
$Taschenrechner.Size = New-Object System.Drawing.Size(470,400)
$Taschenrechner.Text = "Taschenrechner"

#Заголовок
$Titel = New-Object System.Windows.Forms.Label
$Titel.Location = New-Object System.Drawing.Size(70,10) 
$Titel.Size = New-Object System.Drawing.Size(360,50) 
$Font = New-Object System.Drawing.Font("Arial",30,[System.Drawing.FontStyle]::Regular)
$Titel.Font = $Font
$Titel.Text = "Taschenrechner"
$Titel.Name = "Taschenrechner"
$Taschenrechner.Controls.Add($Titel)

#Текстовое поле
$Textfeld= New-Object System.Windows.Forms.TextBox 
$Textfeld.Location = New-Object System.Drawing.Size(25,100) 
$Textfeld.Size = New-Object System.Drawing.Size(100,100)
$Textfeld.Width = (400) 
$Taschenrechner.Controls.Add($Textfeld)

#1
$button1 = New-Object System.Windows.Forms.Button
$button1.Location = New-Object System.Drawing.Size(25,120)
$button1.Size = New-Object System.Drawing.Size(100,50)
$button1.Add_Click({$Textfeld.Text+='1'})
$button1.Text = "1"
$button1.Name = "1"
$Taschenrechner.Controls.Add($button1)

#2
$button2 = New-Object System.Windows.Forms.Button
$button2.Location = New-Object System.Drawing.Size(125,120)
$button2.Size = New-Object System.Drawing.Size(100,50)
$button2.Add_Click({$Textfeld.Text+='2'})
$button2.Text = "2"
$button2.Name = "2"
$Taschenrechner.Controls.Add($button2)

#3
$button3 = New-Object System.Windows.Forms.Button
$button3.Location = New-Object System.Drawing.Size(225,120)
$button3.Size = New-Object System.Drawing.Size(100,50)
$button3.Add_Click({$Textfeld.Text+='3'})
$button3.Text = "3"
$button3.Name = "3"
$Taschenrechner.Controls.Add($button3)

#4
$button4 = New-Object System.Windows.Forms.Button
$button4.Location = New-Object System.Drawing.Size(25,170)
$button4.Size = New-Object System.Drawing.Size(100,50)
$button4.Add_Click({$Textfeld.Text+='4'})
$button4.Text = "4"
$button4.Name = "4"
$Taschenrechner.Controls.Add($button4)

#5
$button5 = New-Object System.Windows.Forms.Button
$button5.Location = New-Object System.Drawing.Size(125,170)
$button5.Size = New-Object System.Drawing.Size(100,50)
$button5.Add_Click({$Textfeld.Text+='5'})
$button5.Text = "5"
$button5.Name = "5"
$Taschenrechner.Controls.Add($button5)

#6
$button6 = New-Object System.Windows.Forms.Button
$button6.Location = New-Object System.Drawing.Size(225,170)
$button6.Size = New-Object System.Drawing.Size(100,50)
$button6.Add_Click({$Textfeld.Text+='6'})
$button6.Text = "6"
$button6.Name = "6"
$Taschenrechner.Controls.Add($button6)

#7
$button7 = New-Object System.Windows.Forms.Button
$button7.Location = New-Object System.Drawing.Size(25,220)
$button7.Size = New-Object System.Drawing.Size(100,50)
$button7.Add_Click({$Textfeld.Text+='7'})
$button7.Text = "7"
$button7.Name = "7"
$Taschenrechner.Controls.Add($button7)

#8
$button8 = New-Object System.Windows.Forms.Button
$button8.Location = New-Object System.Drawing.Size(125,220)
$button8.Size = New-Object System.Drawing.Size(100,50)
$button8.Add_Click({$Textfeld.Text+='8'})
$button8.Text = "8"
$button8.Name = "8"
$Taschenrechner.Controls.Add($button8)

#9
$button9 = New-Object System.Windows.Forms.Button
$button9.Location = New-Object System.Drawing.Size(225,220)
$button9.Size = New-Object System.Drawing.Size(100,50)
$button9.Add_Click({$Textfeld.Text+='9'})
$button9.Text = "9"
$button9.Name = "9"
$Taschenrechner.Controls.Add($button9)

#0
$button0 = New-Object System.Windows.Forms.Button
$button0.Location = New-Object System.Drawing.Size(25,270)
$button0.Size = New-Object System.Drawing.Size(100,50)
$button0.Add_Click({$Textfeld.Text+='0'})
$button0.Text = "0"
$button0.Name = "0"
$Taschenrechner.Controls.Add($button0)

#Десятичная точка
$Punkt = New-Object System.Windows.Forms.Button
$Punkt.Location = New-Object System.Drawing.Size(125,270)
$Punkt.Size = New-Object System.Drawing.Size(100,50)
$Punkt.Add_Click({$Textfeld.Text+='.'})
$Punkt.Text = "."
$Punkt.Name = "."
$Taschenrechner.Controls.Add($Punkt)

#Равно
$gleich = New-Object System.Windows.Forms.Button
$gleich.Location = New-Object System.Drawing.Size(225,270)
$gleich.Size = New-Object System.Drawing.Size(100,50)
$gleich.Text = "="
$gleich.Name = "="
$Taschenrechner.Controls.Add($gleich)

#Делить
$durch = New-Object System.Windows.Forms.Button
$durch.Location = New-Object System.Drawing.Size(325,120)
$durch.Size = New-Object System.Drawing.Size(100,50)
$durch.Text = "https://superuser.com/"
$durch.Name = "https://superuser.com/"
$Taschenrechner.Controls.Add($durch)

#Умножить
$mal = New-Object System.Windows.Forms.Button
$mal.Location = New-Object System.Drawing.Size(325,170)
$mal.Size = New-Object System.Drawing.Size(100,50)
$mal.Text = "x"
$mal.Name = "x"
$Taschenrechner.Controls.Add($mal)

#Минус
$minus = New-Object System.Windows.Forms.Button
$minus.Location = New-Object System.Drawing.Size(325,220)
$minus.Size = New-Object System.Drawing.Size(100,50)
$minus.Text = "-"
$minus.Name = "-"
$Taschenrechner.Controls.Add($minus)

#Плюс
$plus = New-Object System.Windows.Forms.Button
$plus.Location = New-Object System.Drawing.Size(325,270)
$plus.Size = New-Object System.Drawing.Size(100,50)
$plus.Text = "+"
$plus.Name = "+"
$Taschenrechner.Controls.Add($plus)

[void] $Taschenrechner.ShowDialog()

Следующее улучшение моего предыдущего ответа на ваш почти такой же вопрос может помочь, однако такая мозаика приведет вас к погибели (как и меня). Удачи!

Remove-Variable script:Part* -ErrorAction SilentlyContinue
$script:PartialResult=""
$script:PartOperation = ''

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

#Платформа
### код без изменений здесь (около 110 строк)

#Десятичная точка
$Punkt = New-Object System.Windows.Forms.Button
$Punkt.Location = New-Object System.Drawing.Size(225,270)
$Punkt.Size = New-Object System.Drawing.Size(100,50)
$Punkt.Add_Click({$Textfeld.Text+='.'})
$Punkt.Text = "."
$Punkt.Name = "."
$Taschenrechner.Controls.Add($Punkt)

#Равно
$gleich = New-Object System.Windows.Forms.Button
$gleich.Location = New-Object System.Drawing.Size(325,270)
$gleich.Size = New-Object System.Drawing.Size(100,50)
$gleich.Text = "="
$gleich.Name = "="
$Taschenrechner.Controls.Add($gleich)

#Делить
$durch = New-Object System.Windows.Forms.Button
$durch.Location = New-Object System.Drawing.Size(425,120)
$durch.Size = New-Object System.Drawing.Size(100,50)
$durch.Text = "https://superuser.com/"
$durch.Name = "https://superuser.com/"
$Taschenrechner.Controls.Add($durch)

#Умножить
$mal = New-Object System.Windows.Forms.Button
$mal.Location = New-Object System.Drawing.Size(425,170)
$mal.Size = New-Object System.Drawing.Size(100,50)
$mal.Text = "×"
$mal.Name = "*"
$Taschenrechner.Controls.Add($mal)

#Минус
$minus = New-Object System.Windows.Forms.Button
$minus.Location = New-Object System.Drawing.Size(425,220)
$minus.Size = New-Object System.Drawing.Size(100,50)
$minus.Text = "-"
$minus.Name = "-"
$Taschenrechner.Controls.Add($minus)

#Плюс
$plus = New-Object System.Windows.Forms.Button
$plus.Location = New-Object System.Drawing.Size(425,270)
$plus.Size = New-Object System.Drawing.Size(100,50)
$plus.Text = "+"
$plus.Name = "+"
$Taschenrechner.Controls.Add($plus)

Function Operation {
    param([string] $Ope)
### вам нужно показать промежуточный результат и операцию!!!
    if ( $Textfeld.Text -ne '' ) {
        if ($script:PartialResult -ne '' ) {
            $aux = [string] $script:PartialResult + $script:PartOperation + $script:Textfeld.Text
            $script:PartialResult = [string] $( Invoke-Expression $aux )
        } else {
            $script:PartialResult = $Textfeld.Text
        }
        if ( $Ope -eq '=' ) {
            $Textfeld.Text="" + [string] $script:PartialResult
            $script:PartialResult=""
            $script:PartOperation = ''
        } else {
            $Textfeld.Text=""
            $script:PartOperation = $Ope
        }
    }
}

$gleich.Add_Click( { Operation '=' } )
$mal.   Add_Click( { Operation '*' } )   # Имя = "×"
$plus.  Add_Click( { Operation '+' } )   # Имя = "+"
$minus. Add_Click( { Operation '-' } )   # Имя = "-"
$durch. Add_Click( { Operation "https://superuser.com/" } )   # Имя = "https://superuser.com/"

[void] $Taschenrechner.ShowDialog()

Ответ или решение

Создание калькулятора с графическим интерфейсом на PowerShell является отличной задачей для изучения основ работы с PowerShell и графическими интерфейсами Windows Forms. Для данного проекта требуется как создание визуальных элементов интерфейса (формы, кнопок, текстовых полей), так и программирование логики обработки вводимых данных с последующим выполнением математических операций.

Теория

PowerShell является скриптовым языком, который позволяет администрировать системы Windows, а также создавать приложения с графическими интерфейсами с использованием библиотеки .NET, а именно пространства имен System.Windows.Forms. Это позволяет программистам создавать окна и контролы графического интерфейса, такие как кнопки, текстовые поля и другие элементы управления.

В PowerShell можно создавать и управлять элементами графического интерфейса, загружая соответствующие библиотеки и работая с ними аналогично тому, как это делается в C#. Ключевыми элементами, используемыми в данном проекте, являются формы (Form), текстовые поля (TextBox), кнопки (Button) и других элементы управления, которые требуется располагать на форме с указанием их свойств, таких как размер и расположение.

Пример

Пример включает в себя создание простого калькулятора с базовыми операциями: сложением, вычитанием, умножением и делением. Кроме того, здесь реализован ввод чисел и операций через кнопки и получение результата при нажатии на кнопку "=".

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

# Создание формы
$CalculatorForm = New-Object System.Windows.Forms.Form
$CalculatorForm.StartPosition = "CenterScreen"
$CalculatorForm.Size = New-Object System.Drawing.Size(470, 400)
$CalculatorForm.Text = "Калькулятор"

# Добавление поля ввода
$InputBox = New-Object System.Windows.Forms.TextBox
$InputBox.Location = New-Object System.Drawing.Size(25, 20)
$InputBox.Size = New-Object System.Drawing.Size(400, 30)
$CalculatorForm.Controls.Add($InputBox)

# Функция выполнение операции
function PerformOperation {
    if ($InputBox.Text -match '^\s*\-?\d+(\.\d+)?(\s*[\+\-\*\/]\s*\-?\d+(\.\d+)?)*\s*$') {
        try {
            $InputBox.Text = [string](Invoke-Expression $InputBox.Text)
        } catch {
            $InputBox.Text = "Ошибка расчета"
        }
    } else {
        $InputBox.Text = "Ошибка ввода"
    }
}

# Создание кнопок цифр и операций
@(
    @{Text='1'; X=25; Y=60}; @{Text='2'; X=125; Y=60}; @{Text='3'; X=225; Y=60};
    @{Text='4'; X=25; Y=110}; @{Text='5'; X=125; Y=110}; @{Text='6'; X=225; Y=110};
    @{Text='7'; X=25; Y=160}; @{Text='8'; X=125; Y=160}; @{Text='9'; X=225; Y=160};
    @{Text='0'; X=125; Y=210}; @{Text='+'; X=325; Y=60};
    @{Text='-'; X=325; Y=110}; @{Text='*'; X=325; Y=160}; 
    @{Text='/'; X=325; Y=210}; @{Text='='; X=325; Y=260}
) | ForEach-Object {
    $button = New-Object System.Windows.Forms.Button
    $button.Size = New-Object System.Drawing.Size(100, 50)
    $button.Location = New-Object System.Drawing.Size($_.X, $_.Y)
    $button.Text = $_.Text
    $CalculatorForm.Controls.Add($button)

    if ($_.Text -eq "=") {
        $button.Add_Click({PerformOperation})
    } else {
        $button.Add_Click({$InputBox.Text += $_.Text})
    }
}

[void] $CalculatorForm.ShowDialog()

Применение

Данный код создаёт оконное приложение с полем ввода и набором кнопок для операций и ввода чисел. Каждая кнопка при нажатии добавляет соответствующий символ в поле ввода. Когда пользователь нажимает "=", функция PerformOperation проверяет введенную строку на корректность, используя регулярное выражение, и выполняет вес математические вычисления. Используется Invoke-Expression, что позволяет интерпретировать введённую строку как математическое выражение. Если выражение корректно, оно вычисляется и замещает текст в поле ввода. В случае ошибки вычислений или некорректного ввода возвращается сообщение об ошибке.

Такой подход позволяет организовать простой и интуитивно понятный интерфейс калькулятора, поддерживающего базовые математические операции. Это решение также демонстрирует использование регулярных выражений для проверки корректности ввода и обработки ошибок, что важно для создания устойчивых к ошибкам приложений.

Эта реализация демонстрирует основные возможности PowerShell в части создания GUI приложений и может использоваться в качестве отправной точки для создания более сложных систем и добавления новых функций в ваш калькулятор.

Оцените материал
Добавить комментарий

Капча загружается...