WPF 스크린 캡쳐 기능
·
사소한 아이의 소소한 스킬/C#
WPF에서 스크린 캡쳐WPF에서 스크린 캡쳐는 기본적으로 위의 윈폼에서의 스크린 캡쳐와 같다. 즉, 화면크기 만큼의 Bitmap 객체를 할당하고, 여기에 Graphics의 CopyFromScreen() 메서드를 사용하여 화면을 복사해서 넣으면 된다. 단 화면 크기를 구하는 System.Windows.Forms.Screen 을 WPF에서 사용하지 않고 대신 System.Windows.SystemParameters.PrimaryScreenWidth와 SystemParameters.PrimaryScreenHeight 를 사용하게 된다.코드using System.Drawing;using System.Drawing.Imaging;using System.Windows;namespace ScreenCopyWpf{ ..
Hex to float 변환 사이트 (float to hex Converter)
·
사소한 아이의 소소한 스킬/C#
오랜만에 또 올린다...... 자주자주올려야하는데.................. 아무튼...... 이번엔 자주 사용하는 사이트!! https://gregstoll.com/~gregstoll/floattohex/ 위 사이트를 들어가면 hex값을 입력하면 float, double 형태로 변환이 가능하다. 또한 리틀엔디안, 빅엔디안에 따라서도 확인할 수 있다. 코딩해서 값 확인하기전에 미리 이렇게 값확인하는것도 좋은 방법!! 이상 끝! --------------------------------------------------------------------------------------------------------------------------------------------간단한 코드 추가..!! ..
WPF 프로그램에서의 Python 실행 방법
·
사소한 아이의 소소한 스킬/C#
열심히 WPF로 프로그램을 개발했다.. 최종 완성시키고 클라이언트에게도 확인 다 받았는데... 뜬금없이 Python 하나만 실행할 수 있게 해달란다... 뭐 Process 써서 .py 파일만 하나 실행하면되겠지. 라고 맘 편히 생각하고, 놀다가 이제 개발좀 해볼까 하고 개발을 시작했다. 환경설정에 Python 해주고. Command창에서 Python 실행되는거 확인했으니 이제 Process로 실행만 해주면 되겠네 Process cmd = new Process();cmd.StartInfo.FileName = @"python";cmd.StartInfo.Arguments = @"C:\test.py";cmd.Start(); 간단하게 하면 되겠지. 실행 고 에..?? 왜 안되지...... Command창이 떳다가..
C# Excel 사용법.
·
사소한 아이의 소소한 스킬/C#
C#에서 Excel 실행법1dynamic excelApp = AutomationFactory.CreateObject("Excel.Application");cs위와같은 코드를 이용하면 엑셀이 실행된다.하지만 이전에 작업해주어야 할것이 한가지 있다.Excel.Application을 이용하려면 프로젝트에 Microsoft.Office.Interop.Excel 항목을 참조 추가하여야한다.추가 방법은 Project -> Add Reference -> COM 탭 -> Microsoft Excel Object Library체크 -> OK만약 Microsoft Excel Object Library이 보이지않는다면 엑셀의 설치와 VS의 설치 순서가 달라서 안보이는 것이다.Office 2003 : http://www.mi..
C#에서 초마다 정확하게 수행하는 타이머??!!
·
사소한 아이의 소소한 스킬/C#
우리가 개발을 하다보면 멀티 스레드환경으로 꼭 개발이 들어가게 된다. 특히나 UI를 만지다 보면 필수... WPF에서는 특히나 Single Thread 환경이기에 UI Thread에 대한 처리가 꼭 필요하다. MVVM으로 처리를 한다면 백그라운드에서 알아서 잘 해주기에 많은 신경은 안써주어도 알아서 바인딩되서 착착 UI에 업데이트되지만? 아무튼. 이러한 상황에서 1초마다 Timer를 발생시키는 System.Timer 요녀석을 통해 매 초 특정 기능을 수행하려고 한다. 허나 System.Timer는 오차가 존재한다는 점. 윈도우 응용프로그램은 하드웨어 클락? 을 이용치 않기에 오차가 무조건 존재하고 나는 그 오차가 +-0.000몇초차이로 존재하며 앞뒤로 있을 것이라 생각했지만 왠걸... 요런식으로 쌓이기만..
WCF (Window Communication Foundation)
·
사소한 아이의 소소한 스킬/C#
기술적인 포스팅을 해보고싶어졌다... 너무 헤이해졌기에............... 안쓴지도 오래되고.......... 그리하여 고른 기술은 WCF!!! 본론으로 바로...!!! 위키가 말하길 WCF는 윈도우 커뮤니케이션 파운데이션(Windows Communication Foundation, WCF)은 응용 프로그램을 한 대의 컴퓨터나 네트워크에 연결된 여러 컴퓨터를 걸쳐 통신할 수 있게 만들어 주는 새로운 통신 하부 시스템이다. WCF 응용 프로그램들은 닷넷 런타임을 대상으로 하는 언어를 사용하여 개발할 수 있다. 무슨말인지 이해가 가는가.............. 난 그냥 모든지 내 방식대로 내 마음대로 이해하는 스타일이라....... 자세히 말은 못하겠지만..!! 프로세스간 통신하는 방법중 하나인 것으..
WPF 버전 WCF 예제파일
·
사소한 아이의 소소한 스킬/C#
WPF 버전으로 WCF예제를 만들어보았다..... 누가 얼마나 써볼지 모르겠지만......... 일단 사용해보시라........ CLIENT에서 SERVICE를 참조하기 위해서는 Release파일을 파일탐색기에서 실행(관리자 권한)해둔 후 서비스 참조를 해야한다. 그 후 IP와 port를 잘 입력하면 이런식으로 잘 나온다..... 사용법은........... 만들다 귀찮아서...대충만들어서............................ 일단 서비스를 먼저 실행하고 클라이언트를 실행한다. 그 후 서비스의 버튼과 클라이언트의 버튼을 누르면 WCF통신을 하여 string값을 전달하고, 전달 된 값을 textbox에 표출하는게 끝! 함수 상태를 보고 함수를 추가로 생성해서 확인해보면 될 것 같다!
QCheckBox 사용법
·
사소한 아이의 소소한 스킬/PyQT5
import sys from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox, QVBoxLayout from PyQt5.QtCore import Qt class MyApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): cb = QCheckBox('Show title', self) # Text 설정 cb.setText("SetText") # Text 가져오기 print(cb.text()) # 상태 변경 cb.toggle() # 상태 확인하기 print(cb.isChecked()) # 상태 변경 이벤트 cb.stateChanged.connect(self.cha..
C# 실행파일 이름 변경하기..!!
·
사소한 아이의 소소한 스킬/C#
오늘은 정말 간단한부분에 대해서 남겨볼까 한다. 프로젝트를 개발할 시 이름이 빈번하게 바뀌진 않지만 아에 안바뀐단 보장도 없다.. 그래서 처음에는 WpfApp1 이라는 이름으로 프로젝트를 만들었는데... 이게... ConsoleApp1 이라는 이름으로 바꿔야 하는 상황이 온다면...?? 이런 경우 간단하게 수정할 수 있다. 바로 ㄱㄱ Visual Studio에서 변경할 프로젝트를 우클릭하여 속성으로 들어가준다. 어셈블리 이름을 WpfApp1 에서 ConsoleApp으로 변경! 그러면 기존에 이랬던 이름이 이렇게 ConsoleApp1 로 변경! 하지만.. 나는 이걸로도 만족을 못했다... 왜냐하면.. 작업관리자에서는 변경이 안됐기 때문에......... 작업관리자에서 까지 변경을 해준다면 다음과 같이 진행..
QTabWidget 사용법
·
사소한 아이의 소소한 스킬/PyQT5
import sys, os from PyQt5.QtWidgets import QTabWidget, QLabel, QWidget, QVBoxLayout, QApplication, QMessageBox class BaseWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.tabs = QTabWidget() self.tabs.blockSignals(True) #just for not showing the initial message self.tabs.currentChanged.connect(self.onChange) #changed! self.lbl1 = QLabel("Label 1") self...
ChatGPT로 써보는 C# Thread
·
사소한 아이의 소소한 스킬/C#
Chat GPT로 C#의 Thread 내용을 써보았다.. 내용을 보니 나름 괜찮게 써주는듯..? ------------------------------------------------------------------------------------------------------------------------------------------------------ C# Thread는 C# 언어에서 멀티스레딩을 구현하기 위한 기능입니다. 스레드는 하나의 프로세스 내에서 독립적으로 실행되는 실행 흐름으로, 여러 작업을 동시에 처리할 수 있도록 해줍니다. 이를 통해 프로그램의 성능을 향상시킬 수 있습니다. Thread는 System.Threading 네임스페이스에 속해 있으며, Thread 클래스를 사용하여 ..
040. MariaDB 한글깨짐 문제
·
사소한 아이의 소소한 스킬
오늘은 C#말고... 그냥 DB 관련해서 잠깐만 알아보자. DB종류는 참 여러가지가 있다 MS-SQL, my-SQL, MariaDB, PostgreSQL 등등등 그중에 MariaDB에서의 한글깨짐을 알아보자.. MariaDB를 그냥 설치하고(계속 Next만눌러서..) 한글 데이터를 넣으면 아래와 같이 나올 것이다.. (안나오면.....그냥 넘어가도...) 저렇게 ??? 나오는것이 한글인데..... MariaDB설치시 character를 제대로 설정안해줘서 나오는 문제다. 그렇다면 해결방법은..? 간단하다... ini파일을 수정한 후 서비스에서 재시작해주면 끝.. ini파일은 C:\\Program Files\\MariaDB 10.1\\data\\my.ini 파일이다 (디폴트 위치) 해당 ini파일을 열어서..
HPP 파일이 대체 뭐야?
·
사소한 아이의 소소한 스킬/C_C++
현재 C와 C++를 좀 파악하고있는 중이다...... 예전에 C/C++를 배울때.... (10년도 더됐다.....) 그냥 c의 확장자는 .c, c++의 확장자는 cpp 이렇게 알고있었고.. c++은 c로도 쓸수있다고 했던거같기도 하다....(뭐 인터넷이 그렇다니까....... 그랬던거같기도 하고....) 아무튼 이렇게 알고 살고있었는데.. cxx, hpp, hxx 이런파일은 대체 뭐지............ 리얼 이게 무슨 확장자인가 해서 검색해보았다.......... 확장자 내용 c 진짜 말그대로 C 프로그래밍의 소스파일 cpp 우리가 배우고 자랐던 C++프로그래밍의 소스파일 cxx 이것또한 우리가 배우고 자랐던 C++ 프로그래밍 소스파일이다. +를 45로 기울여서 작성한것인데..다른나라에서는 이렇게도 ..
아 나도 모르겠다!!
·
사소한 아이의 소소한 스킬/C_C++
맡은 업무가 계속 바뀐다.......... 2011년부터 프로그래머라는 직업으로 돈을 벌고있다.. 실력은 하나도없지만...아무튼... 그렇게 되었다.. 처음엔 언리얼 엔진을 이용한 게임개발.. 거기서도 플래쉬를 이용한 미들웨어 스케일폼으로 게임 UI 개발이 주된 업무였다. 그리하여 언리얼 스크립트 + 플래시 액션스크립트 2.0 2가지를 주로 사용해서 개발했고... 플래시야 그 당시에도 다 죽어가는 언어였고... 언리얼 스크립트는 바로 언리얼4가면서 버려지는 언어가 됐다.. 그러다 이직하면서 C#, WPF 를 주 언어로 사용 WPF만 근 8년을 해온거 같다.... 그러다 최근 또 이직을 하면서 파이썬 개발........ 그래 파이썬까지는 그래도... 윈도우 프로그래밍이라..괜찮았다... 근데 이젠 임베디드..
파일 경로 관련 API들
·
사소한 아이의 소소한 스킬/Python
개발을 하다보면 경로 관련해서 계산해야 할 때가 있다. 물론 QFileDialog등과 같은 api를 이용해서 선택한 파일의 path를 가져올 수도 있지만... 현재 실행되는 위치에서 상대적으로 위치를 계산하거나.. 절대적인 경로를 가져오거나 할때는 굳이 FileDialog를 안쓰고 가져올 수도 있다... 그 방법 들이다..! 현재 폴더 가져오기 os.getcwd() Output: C:\Users\Administrator\PycharmProjects\pythonProject2\ 디렉토리 위치 변경하기 os.chdir("C:\Program Files (x86)\ESTsoft") 절대 경로 가져오기 print(os.path.abspath("")) Output: C:\Users\Administrator\Pych..
DFS(깊이우선탐색)
·
사소한 아이의 소소한 스킬/알고리즘
이번엔 DFS를 알아보도록하자. DFS란 한국말론 깊이우선 탐색(Depth First Search)이다. 깊이우선탐색은 무엇인가.. 무언가 탐색을 할때 동일한 레벨의 노드를 탐색을 먼저 하는것이 아니라 아랫레벨의 노드를 우선 탐색하는 시스템이다. 역시 말로는 이해가 안가니... 이미지로...... 사진과 같은 트리가 존재할때 깊이우선의 경우에 이렇게 순회하게된다.(우측, 좌측의 순서는 없음) A -> B -> H -> M -> J -> K -> L -> I -> C -> D -> G -> E -> F 대충 느낌이 팍 오죠? 그럼 어떤식으로 구현하면 될지 생각을 해보면... stack 구조를 이용해서 노드를 추가한 후 추가한 노드를 다시 탐색하고 추가한 노드를 다시 탐색하고 하면 깊이 우선이 가능!!!! ..
BFS(너비우선탐색)
·
사소한 아이의 소소한 스킬/알고리즘
이번엔 BFS를 알아보도록하자. BFS란 한국말론 너비우선 탐색(Breadth First Search)이다. 너비우선탐색은 무엇인가.. 깊이와 반대다... 무언가 탐색을 할때 추가된 노드를 우선적으로 탐색하는것이 아니라 이미 추가되어있는 노드를 우선적으로 탐색하는 것.. 역시 말로는 이해가 안가니... 이미지로...... (DFS와 동일한 노드) 사진과 같은 트리가 존재할때 깊이우선의 경우에 이렇게 순회하게된다. (우측, 좌측의 순서는 없음) A -> B -> C -> H -> D -> I -> J -> M -> E -> G -> K -> F -> L 대충 느낌이 팍 오죠? 그럼 어떤식으로 구현하면 될지 생각을 해보면... DFS의 경우 추가된 노드를 우선적으로 순회했지만.. 이번에는 이미 추가되어있는 ..
재귀함수
·
사소한 아이의 소소한 스킬/알고리즘
재귀함수에 대해 알아보자. 재귀함수란 자기 자신을 다시 호출한다는 의미.... 자기자신을 다시 호출하는데 파라미터를 바꿔가면서 호출한다. 여기서 무한정 자기자신을 호출할 수 있기에 종료조건은 필수로 필요하다. 그리하여 반복계산할수있도록 하는 것.. 이렇게만 말하면 헷갈리니..예제 코드를.. def factorial(n: int) -> int: # 종료조건 if n int: if x > y: return x else: return y def max_array(array: int, len: int) -> int: if len == 1: return array[0] else: return max(array[len - 1], max_array(array, len - 1)) temp_array = [33, 44,..
평균 구하기
·
사소한 아이의 소소한 스킬/Python
이번엔 평균 구하기다...... 또 다시 C#을 먼저 말해본다면.. 리스트에 .Sum(), .Average() 함수가 존재하여 호출만 해주면 끝.... C# 너무 편하죠............... 파이썬도 쉽게 사용하기 위한 언어니깐 당연히 편한게 있겠지!!!! 바로 코드 ㄱㄱ import statistics arr1 = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100] arr2 = [15, 26, 48, 59, 57, 68, 35, 24] # 평균 구하기 result1 = statistics.mean(arr1) result2 = statistics.mean(arr2) # 출력 print(f"average1 : {result1}") print(f"average2 : {result..
시간 측정하기
·
사소한 아이의 소소한 스킬/Python
프로그램을 개발하다보면.... 특정 모듈이... 특정 함수가.. 시간이 얼마나 걸리는지 체크해야할때가 있다. WPF의 경우 Stopwatch라는 클래스가 따로 존재하여 start, stop함수를 통해 계산했었는데... 파이썬은...어떤함수가 있을지 알아보도록 하자.. 파이썬의 기본 모듈인 time 모듈을 확인하면 시간측정을 할 수 있다 바로 코드 ㄱㄱ import time start = time.time() print("시간측정") print("some function....") end = time.time() print(f"{end - start:.5f} sec") Output: 0.00000 sec 너무 간단한 print문 2개라.. 0.000초가 나온다... 좀 시간이 걸릴만한걸하면... impor..
QDialog&QMessageBox 사용법
·
사소한 아이의 소소한 스킬/PyQT5
import sys, os from PyQt5.QtWidgets import * class BaseWindow(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lbl = QLabel("EXAMPLE") self.btn_1 = QPushButton("QInputDialog") self.btn_1.clicked.connect(self.Input_showDialog) self.btn_2 = QPushButton("QColorDialog") self.btn_2.clicked.connect(self.Color_showDialog) self.btn_3 = QPushButton("QFontDialog") self..
QSpinBox 사용법
·
사소한 아이의 소소한 스킬/PyQT5
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSpinBox, QDoubleSpinBox, QVBoxLayout class MyApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lbl1 = QLabel('QSpinBox') self.spinbox = QSpinBox() self.spinbox.setMinimum(-10) self.spinbox.setMaximum(30) # self.spinbox.setRange(-10, 30) self.spinbox.setSingleStep(2) self.lbl2 = QLabel('..
QDateTimeEdit 사용법
·
사소한 아이의 소소한 스킬/PyQT5
import sys from PyQT5.QtWidgets import QApplication, QWidget, QLabel, QDateTimeEdit, QVBoxLayout from PyQT5.QtCore import QDateTime class MyApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.lbl = QLabel('QTimeEdit') self.lbl2 = QLabel('QTimeEdit') self.datetimeedit = QDateTimeEdit(self) self.datetimeedit.setDateTime(QDateTime.currentDateTime()) self.dateti..
QComboBox 사용법
·
사소한 아이의 소소한 스킬/PyQT5
import sys from PyQt5.QtWidgets import QApplication, QWidget, QComboBox, QLabel, QVBoxLayout from PyQt5.QtCore import Qt class MyApp(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): # 라벨 생성 self.l = QLabel('Option1', self) # 콤보 박스 생성 self.cb = QComboBox(self) # 콤보 아이템 추가 self.cb.addItem('Option1') self.cb.addItem('Option2') self.cb.addItem('Option3') self.cb.addIt..
Python 간단 팁
·
사소한 아이의 소소한 스킬/Python
리스트 역변환시키기 a=[“10”,”9",”8",”7"] print(a[::-1]) a.reverse() Output: ['7', '8', '9', '10'] # a[::-1]과 a.reverse()의 차이점 # a[::-1]의 경우 실 데이터 변경없이 거꾸로 출력만 진행하되 # reverse의 경우 실 데이터 자체를 역변환 시켜버림으로써 이 다음 작업 진행 시에도 역변환이 진행되었다는 것을 알고 있어야 한다. 리스트 합치기 a=[‘a’,’b’,’c’,’d’] b=[‘e’,’f’,’g’,’h’] for x, y in zip(a, b): print(x,y) Output: a e b f c g d h 리스트 내에서 빈번한 값 찾기 a = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4] print..
Wav 파일 헤더정보 보기
·
사소한 아이의 소소한 스킬/Python
def wav_print(file_path): # 파일 읽어오기 file = open(file_path, "rb") # 44바이트의 헤더정보 가져오기 data = file.read(44) # 44바이틔 헤더 정보를 Dictionary 형태로 저장하기 file_header = {"name": file_path, "ChunkID": data[0:4], "ChunkSize": int.from_bytes(data[4:8], byteorder='little'), "Format": data[8:12], "Subchunk1ID": data[12:16], "Subchunk1Size": data[16:20], "AudioFormat": int.from_bytes(data[20:22], byteorder='little')..
QThread & Custom Signal 예시
·
사소한 아이의 소소한 스킬/PyQT5
이번에는 QThread 사용법이다. 다른 언어에서도 다 사용하듯 1개의 쓰레드로 모든 기능을 처리한다는 것은 불가능에 가깝다. 특히나 UI가 있다면 더더욱.. (프리징현상 어쩔꺼야...) 그리하여 이번엔 QTthread이다. 정말 간단한 예제이며 QT에서는 QThread말고 QRunnable 등 다른 여러가지 Thread 사용법들이 있다.. 차차 하나씩 알아보고 이번엔 간단한 QThread만 알아보도록 하자 from PySide6.QtCore import * from PySide6.QtWidgets import * import sys import time # 내 돈 balance = 100 # 돈을 1씩 계속 없애는 QThread class Balance_decrease(QThread): # Custom..
파이썬 변수 타입설정??????
·
사소한 아이의 소소한 스킬/Python
파이썬은 기본적으로 아래와 같이 타입을 설정하지 않고 변수를 설정한다. # 자동적으로 int형 AAA = 22 # 자동적으로 string형 BBB = "string" # 자동적으로 list CCC = [1,2,3,4] 이러한 방식은 내가 사용하던 C#과 너무 헷갈리고.. 어떠한 타입으로 선언되는건지 헷갈린다. 선언자체는 문제없지만 해당 변수를 가지고 놀때 굉장히 헷갈린다...(일단 나는....) C#의 경우 int AAA = 22 string BBB = "string" List CCC = new List() { 1, 2, 3, 4 } ; 얼마나 보기 편한가.. 물론 C#에서도 var 변수가 있어서 python처럼도 선언할 수 있다...하지만.. var변수를 잘 안쓰고... 뭔가 명확하게 형을 선언하는것을..