我正在努力在我的Python项目中实现日志记录,并且遇到了一些障碍.我正在尝试设置我的日志记录,以便处理程序和格式化程序都组织到一个配置文件中.我现在要做的是设置我fileHandler将创建一个看起来像这样的日志文件:YYYY_MM_DD.log显然Y代表年份,M代表月份,D代表当天.
这是我尝试使用我的配置文件:
[loggers]
keys=root,MainLogger
[handlers]
keys=fileHandler, consoleHandler
[formatters]
keys=logFormatter, consoleFormatter
[logger_root]
level=DEBUG
handlers=fileHandler
[logger_MainLogger]
level=DEBUG
handlers=fileHandler, consoleHandler
qualname=MainLogger
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=consoleFormatter
args=(sys.stdout,)
[handler_fileHandler]
class=FileHandler
level=DEBUG
formatter=logFormatter
args=(datetime.now().strftime('%Y_%m_%d.log'), 'a')
[formatter_logFormatter]
format=%(asctime)s | %(levelname)-8s | %(lineno)04d | %(message)s
[formatter_consoleFormatter]
format=%(asctime)s | %(levelname)-8s | %(fillname)s-%(funcName)s-%(lineno)04d | %message)s
Run Code Online (Sandbox Code Playgroud)
我用来测试配置的文件非常简单:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('MainLogger')
logger.debug("TEST")
Run Code Online (Sandbox Code Playgroud)
我目前得到的具体错误是:
configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: "%Y_%m_%d.log'), 'a')"
Run Code Online (Sandbox Code Playgroud)
我已经尝试更改了%Y,%m并且%d正如错误所说,但这并不能解决问题.我如何设置配置文件,以便我的日志文件看起来像我想要的那样? …
我正在开发一个程序,该程序具有使用 Tkinter 创建的虚拟键盘。启用键盘的页面具有用户需要输入数据的输入小部件。我使用pyautogui虚拟键盘的一部分来模拟键盘按下,但我的问题是当用户按下键盘上的任何按钮时聚焦的小部件。由于每个键盘按钮都是ttk.Button当他们按下按键时,该按钮具有焦点,而不是他们选择的输入小部件,他们试图将数据放入其中。
因此,现在我有运行按键的方法,在按键之前调用特定的小部件以成为焦点。这是我现在的代码:
import tkinter as tk
from tkinter import ttk
import pyautogui
def drawKeyboard(parent):
keyboardFrame = tk.Frame(parent)
keyboardFrame.pack()
keys = [
[ ("Alpha Keys"),
[ ('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'),
(' ', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l'),
('capslock', 'z', 'x', 'c', 'v', 'b', 'n', 'm'),
('delete', 'backspace', 'home', 'end')
]
],
[ ("Numeric Keys"),
[ ('7', '8', '9'),
('4', '5', '6'),
('1', '2', '3'),
(' …Run Code Online (Sandbox Code Playgroud) 因此,我正在创建一个 GUI,并且我正在尝试制作它,以便所有内容都能适当地显示在屏幕上。我已经绘制了我希望 GUI 的每个部分看起来像它的大小的粗略草图,所以我知道所有东西的粗略尺寸。
然而,我遇到的第一个问题是设置屏幕的左半部分。
所以左半由一个框架,我们将调用MainFrame,即由2架,我们会打电话LabelFrame和ButtonFrame
MainFrame 需要 385 像素宽,460 像素高。LabelFrame 应该是 375 像素宽,115 像素高。ButtonFrame 需要 375 像素宽,330 像素高。我的问题是我不知道如何将这些尺寸设置为框架。
我self.config(width = num, height = num)显然已经尝试用适当的值替换 num ,但这没有做任何事情。
我知道窗口本身有一种.geometry方法,但我无法找到 tk.Frame 的等效方法
So here's the issue. I am programming a GUI using Python's TKinter, and I need the window to be a specific size. The release version of the program will have the screen settings as root.attributes("-fullscreen", True) so that it's fullscreen and the user won't be able to access any menus. Said screen will be an 800x480 tablet screen.
Obviously I am programming on a screen much bigger than 800x480, so when I create my tkinter window I am setting root.minsize("800x480") …
所以我正在创建一个Python程序,它读取一个.ini文件来为主程序设置一些启动变量.我唯一的想法是,我希望程序在初始化时检查.ini文件是否存在,如果不存在,则使用一组默认值创建它.如果有人意外删除了该文件,那就是一种先发制人的错误修复方法.
我似乎无法找到任何关于如何做到这一点的例子,而且我对Python没有超级经验(只用它编程大约一周)所以我很感激任何帮助:)
编辑:经过进一步思考,我想进一步追求这一点.
我们假设文件确实存在.如何检查以确保它具有适当的部分?如果它没有相应的部分,我将如何删除文件或删除内容并重写文件的内容?
我试图用这个白痴证明:P
val1 = hex(100)
val2 = hex(50)
val3 = hex(int(val1, 16) - int(val2, 16))
hex_str = str(val1) + str(val2) + str(val3)
print(hex_str)
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我的最终目标是有一个看起来像这样的字符串: 643232
然而,目前我得到的结果的字符串为 0x640x320x32
Python中有没有办法0x从十六进制字符串的开头删除?
或者我是否必须使用正则表达式将其删除re.sub()?
编辑:我还需要确保我总是得到太多的角色。因此,例如,如果我正在寻找 5 的十六进制值,我会得到05
我目前正在研究一个数据库,其中需要一个日志来跟踪一堆不同的数据更改。诸如价格变化、项目状态变化等。为了实现这一点,我制作了不同的“日志”表来存储需要保留的数据。
举一个可靠的例子,为了跟踪需要订购的零件的价格变化,我创建了一个名为Part_Price_Log. 主键由修改零件价格的日期和Parts表中零件唯一 ID 的外键组成。
我的逻辑是,如果您需要查找零件的当前价格,您只需找到该零件 ID 的最新条目。但是,有人告诉我不要以这种方式实现它,因为使用 Date 作为主键的一部分是一种在数据中获取错误的简单方法。
所以我的问题是这样的。
使用日期列作为复合主键的一部分有什么优点/缺点?有哪些更好的选择?
我正在尝试制作一个跨框架内多列的TTK按钮。基本上,我有两排按钮,并且我希望两排下面的最后一个按钮跨越两排的宽度。
但是,我不确定如何实现这一目标。这是我在按钮上的代码:
btnOff = ttk.Button(self, text = "OFF", command = tc.Off).
grid(column = 1, row = 10, columnspan = 2, rowspan = 2)
Run Code Online (Sandbox Code Playgroud)
我尝试增加列宽,但似乎无济于事。实际上,即使我尝试正常设置它,它也比它上面一行中的其他按钮小,即使所有这些按钮的网格代码都与我上面发布的相同。
我正在使用一个使用tkinter TopLevel窗口的程序来定期向用户显示更新日志信息.我的问题是主程序是全屏的,所以无论何时打开日志窗口后它们与它进行交互,日志窗口都不可见,因为它现在位于主程序之后.
有没有办法强制Toplevel窗口(或实际上,任何Tkinter窗口)永久保持在所有其他窗口的顶部?
考虑这个快速设置,例如:
import tkinter as tk
from tkinter import ttk
class Example(tk.Frame):
def __init__(self, master, *args, **kwargs):
tk.Frame.__init__(self, master, *args, **kwargs)
self.pack()
btn = ttk.Button(self, text = "Press", command = self.openTopLevel)
btn.pack()
def openTopLevel(self):
topLevelWindow = tk.Toplevel(self)
root = tk.Tk()
main = Example(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)
当您按下按钮并打开Toplevel窗口时,它位于顶部.但是如果你抓住框架,移动它等等,Toplevel会支持它.我怎么阻止它?或者这不是Tkinter允许我做的事情吗?
是的,我见过这个问题。不,它没有解决我的问题。
我正在 VB.Net 中开发一个与 SQL Server 数据库接口的应用程序。目前我正在尝试让 VB.Net 应用程序在数据库上执行以下存储过程:
CREATE PROCEDURE dbo.AddSupplierAddress(
@Supplier VARCHAR(100),
@Street VARCHAR(100),
@City VARCHAR(50),
@Region VARCHAR(50),
@Code VARCHAR(7),
@Info VARCHAR(500) = NULL,
@response NVARCHAR(500) = OUTPUT
) AS
BEGIN
DECLARE @SupplierID INT, @RegionID INT
SELECT @SupplierID = supplier_id
FROM suppliers
WHERE supplier_name = @Supplier
IF @SupplierID IS NULL
BEGIN
SET @response = 'Could not add address to Supplier "' + @Supplier + '". Supplier does not exist.'
RETURN
END
SELECT @RegionID = region_id
FROM …Run Code Online (Sandbox Code Playgroud) 所以我最近刚接触 Python,但我似乎能够编写一些东西并让它工作。然而,我一直在尝试扩展我对语言中事物如何工作的知识,而将这个简单的文件放在一起让我感到困惑。
class TestA:
def __init__(self):
self.varNum = 3
def printNum(self):
print(self.varNum)
class TestB:
varNum = 0
def __init__(self):
varNum = 3
def printNum(self):
global varNum
print(varNum)
a = TestA()
a.printNum()
b = TestB()
b.printNum()
Run Code Online (Sandbox Code Playgroud)
TestA将3 正确打印到屏幕的代码。然而,代码TestB却给了我NameError这样的说明:'varNum' is not defined。无论我是否有global varNum这条线,我都会收到该错误。
我想令我困惑的是我将该__init__函数视为类构造函数。当我使用 Java 或 C# 等语言进行编程时,我在构造函数之外声明了全局变量,以便它们的作用域是整个类。这不是 Python 中的东西吗?我编写的代码只是标记self.了所有内容,因为我只是想快速地将一些东西放在一起,但我现在正在尝试更多地了解该语言。self.Python 中创建类作用域变量的唯一方法是什么?或者还有其他方法吗?
谢谢你的时间 :)